在documentation中,TypeVar
用作泛型类型和泛型函数定义的参数。它还允许我们限制通用类型或函数的可能类型。
如果我使用mypy运行以下代码,它将正确地将y
标识为int
,将z
标识为float
。
from typing import TypeVar, Any
Array = TypeVar("Array")
X = TypeVar("X", int, float, str, complex)
def identity(x: X) -> X:
return x
if __name__ == '__main__':
y = identity(5)
z = identity(5.5)
reveal_type(y)
reveal_type(z)
但是,如果我将X
的定义更改为X = TypeVar("X", int, float, str, complex, Any)
,那么我从mypy得到的显示的y
和z
的类型仅为Any
。
我的问题是:这是一个错误还是我错误地使用了TypeVar
?如果TypeVar是错误的输入方式,那么我应该如何键入此函数?
有趣的是,如果我改为将X
定义为X = TypeVar("X", Any, int, float, str, complex)
,则可以像以前一样获得y
和z
的正确显示类型,但是有关{ {1}}没有说任何关于命令的信息,这可能只是实现细节,而依赖于它会很脆弱。将TypeVar
放在Any
之后会显示int, float,
和y
的类型为z
,这是错误的。
注意:我实际上想添加到约束类型中的是numpy数组,但是由于它没有类型信息,因此mypy将其解释为complex
,并且具有相同的效果。