我想定义一个函数example
,该函数接受类型为Widget
的参数或任何扩展了Widget
并返回与该参数相同类型的参数。因此,如果Button
扩展了Widget
,则调用example(Button())
会返回类型Button
。
我尝试了以下操作:
T_co = TypeVar('T_co', Widget, covariant=True)
def example(widget: T_co) -> T_co:
...
但是类型检查器(Pyright)忽略协方差。经过进一步研究,我在PEP 484中找到了一个注释:
注意:协方差或对数不是 类型变量的属性,而是使用此变量定义的通用类的属性。差异仅适用于泛型类型;泛型函数没有此属性。后者只能使用没有
covariant
或contravariant
关键字参数的类型变量来定义。
但是,如果我尝试定义不带注释中指定的协变参数的泛型函数:
T_co = TypeVar('T_co', Widget)
def example(widget: T_co) -> T_co:
...
我只能将类型Widget
的值传递给函数(不能传递Button
)。
我该如何实现?
答案 0 :(得分:0)
我能够在MyPy docs中找到答案。原来我在寻找bound
,而不是covariant
。可以这样做:
T = TypeVar('T', bound=Widget)
def example(widget: T) -> T:
...