如何在Python中定义通用协变函数?

时间:2019-10-14 15:18:57

标签: python python-3.x function generics python-typing

我想定义一个函数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中找到了一个注释:

  

注意:协方差或对数不是 类型变量的属性,而是使用此变量定义的通用类的属性。差异仅适用于泛型类型;泛型函数没有此属性。后者只能使用没有covariantcontravariant关键字参数的类型变量来定义。

但是,如果我尝试定义不带注释中指定的协变参数的泛型函数:

T_co = TypeVar('T_co', Widget)

def example(widget: T_co) -> T_co:
  ...

我只能将类型Widget的值传递给函数(不能传递Button)。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

我能够在MyPy docs中找到答案。原来我在寻找bound,而不是covariant。可以这样做:

T = TypeVar('T', bound=Widget)

def example(widget: T) -> T:
  ...