Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 键入:TypeVar vs.Union,mypy错误:缺少泛型类型的类型参数_Python_Python 3.x_Typing_Mypy_Python Typing - Fatal编程技术网

Python 键入:TypeVar vs.Union,mypy错误:缺少泛型类型的类型参数

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

尽管在、和中花费了大量时间,但我还是很难理解何时使用TypeVar以及何时使用Union

这个问题的简单版本是:
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]
那样使用它时,我不知道如何更清楚地解释它。