我想要定义一个函数example
,它接受Widget
类型的参数或任何扩展Widget
并返回与参数相同类型的参数。因此,如果Button
扩展了Widget
,调用example(Button())
将返回Button
类型。
我尝试了以下几点:
T_co = TypeVar('T_co', Widget, covariant=True)
def example(widget: T_co) -> T_co:
...
然而,类型检查器(Pyright)忽略协方差。经过进一步的研究,我在佩普484上找到了一条便条
注意:协方差或反方差不是类型变量的属性,而是使用该变量定义的泛型类的属性。方差仅适用于泛型类型;泛型函数不具有此属性。后者应该只使用没有
covariant
或contravariant
关键字参数的类型变量来定义。
但是,如果我试图定义一个泛型函数,而不使用注释中指定的协变参数:
T_co = TypeVar('T_co', Widget)
def example(widget: T_co) -> T_co:
...
我只能将Widget
类型的值传递给函数(而不是Button
)。
我怎样才能做到这一点?
发布于 2019-10-14 18:30:35
我在MyPy文档上找到了答案。原来我是在找bound
,而不是covariant
。这样做是可以的:
T = TypeVar('T', bound=Widget)
def example(widget: T) -> T:
...
https://stackoverflow.com/questions/58379692
复制相似问题