Python 键入:TypeVar vs.Union,mypy错误:缺少泛型类型的类型参数
尽管在、和中花费了大量时间,但我还是很难理解何时使用TypeVar以及何时使用Union 这个问题的简单版本是:Python 键入:TypeVar vs.Union,mypy错误:缺少泛型类型的类型参数,python,python-3.x,typing,mypy,python-typing,Python,Python 3.x,Typing,Mypy,Python Typing,尽管在、和中花费了大量时间,但我还是很难理解何时使用TypeVar以及何时使用Union 这个问题的简单版本是:Numeric=TypeVar('Numeric',int,float)和Numeric=Union[int,float]之间有什么区别 下面是我遇到的一个更详细的例子: ”示例1.py 使用Union定义“数字”类型。 """ 从键入import Union、Sequence 数值=联合[int,float] 向量=序列[数字] 矩阵=序列[向量] 请与mypy联系: $ mypy
Numeric=TypeVar('Numeric',int,float)
和Numeric=Union[int,float]
之间有什么区别
下面是我遇到的一个更详细的例子:
”示例1.py
使用Union定义“数字”类型。
"""
从键入import Union、Sequence
数值=联合[int,float]
向量=序列[数字]
矩阵=序列[向量]
请与mypy联系:
$ mypy --strict example1.py
Success: no issues found in 1 source file
$ mypy --strict example2.py
example2.py:11: error: Missing type parameters for generic type "Vector"
Found 1 error in 1 file (checked 1 source file)
改用TypeVar
:
“example2.py
使用TypeVar定义“数值”类型。
"""
从输入importtypevar、Sequence
Numeric=TypeVar('Numeric',int,float)
向量=序列[数字]
矩阵=序列[向量]
请与mypy联系:
$ mypy --strict example1.py
Success: no issues found in 1 source file
$ mypy --strict example2.py
example2.py:11: error: Missing type parameters for generic type "Vector"
Found 1 error in 1 file (checked 1 source file)
上述mypy
错误是指Matrix
的定义。为什么mypy
对example1.py
感到满意,而对example2.py
不满意
我可以通过将最后一行更改为Matrix=Sequence[Vector[Numeric]]
来消除example2.py中的错误
版本信息:
$python--版本
Python 3.8.4
$mypy--版本
mypy 0.782
TypeVar
用于创建泛型类型
Numeric = TypeVar('Numeric', int, float)
Vector = Sequence[Numeric]
。。。表示Vector[T]
是Sequence[T]
的别名,约束条件是issubclass(T,(int,float))
。这意味着mypy认为Vector
是一种不完整的类型,它会问:“什么向量?”,您可以将Vector[Numeric]
写为“任何数值的向量”
它通常用于函数或类,如:
T = TypeVar('T')
V = TypeVar('V')
def map(f: Callable[[T], V], it: Iterable[T]) -> Iterator[V]:
for x in it:
yield f(x)
这意味着,即使您不知道将得到什么类型,也可以确保类型安全。我不确定错误本身。通常,TypeVar
正好是int
或float
中的一个的占位符,但在您实际提供基于它的值之前,该选项不会固定。也就是说,Matrix
可以包含所有int
值或所有float
值,但不能混合使用。使用联合
,单个矩阵
的每个元素可以是一个int
或float
,独立于其他元素的类型。而TypeVar
和联合
有不同的用例,这个答案并不能解释为什么example2.py
可以按原来的方式进行修复。我想我应该更明确地说明这一点,是的。你认为我的编辑正确地解释了吗?好的,是的。我想我的困惑在于认为序列比实际情况简单。谢谢你的回答。我仍然不明白为什么声明Vector=Sequence[Numeric]
会导致“不完整类型”,因为我已经指定它应该是一个数字序列。我(也许是天真的)目标是将Vector
定义为由int
s和/或float
s组成的任何序列。我想把矩阵
简单地看作是一个向量序列。最后,我想对函数进行注释,比如def dot\u product(v1:Vector,v2:Vector)
。然后,在dot_product
中,我知道v1
和v2
的每个元素要么是int
s,要么是float
s。对于这个用例,我会使用Union
来定义Numeric
?是的,您会使用Union
TypeVar
用于泛型类型,因为当您想像Vector[T]
那样使用它时,我不知道如何更清楚地解释它。