python 泛型_Python中的受限泛型类型提示

我想创建一个像这里这样的工厂方法。

class A:

...

class B(A):

def f(self):

...

class C:

...

def factory(cls):

return cls()

A

允许作为的参数

factory

.

什么时候?

B

通过,则正确检测到

factory(B)

是的实例

B

,即。

factory(B).f()

允许

factory(A).f()

尝试1

使用

Type

typing

模块。

from typing import Type

class A:

...

class B(A):

def f(self):

...

class C:

...

def factory(cls: Type[A]):

return cls()

factory(A) # Ok

factory(B) # Ok

factory(C) # Fail

factory(A).f() # Fail

factory(B).f() # Fail -- Wrong!

这个正确地检测到了

C

. 然而,

工厂(B).f()

尝试2

使用

TypeVar

.

from typing import TypeVar, Type

T = TypeVar('T')

class A:

...

class B(A):

def f(self):

...

class C:

...

def factory(cls: Type[T]) -> T:

return cls()

factory(A) # Ok

factory(B) # Ok

factory(C) # Ok -- Wrong!

factory(A).f() # Fail

factory(B).f() # Ok

很好地推断

工厂(B).f()

很好,但是

工厂(A).f()

尝试3

向添加约束

T

.

from typing import TypeVar, Type

class A:

...

class B(A):

def f(self):

...

class D(A):

...

class C:

...

T = TypeVar('T', A)

def factory(cls: Type[T]) -> T:

return cls()

factory(A) # Ok

factory(B) # Ok

factory(C) # Fail

factory(A).f() # Fail

factory(B).f() # Ok

A single constraint is not allowed

不过,出现错误的原因还不清楚。在pep484中,只有一句简短的话:“如果有,至少应该有两个约束;不允许指定一个约束。”

有什么好的解决办法吗?我只需要添加一个“虚拟”类

_A

,的空子类

A

_A = NewType('_A', A)

T = TypeVar('T', A, _A)

def factory(cls: Type[T]) -> T:

return cls()

但我并不认为这是一个好的解决办法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值