Python 使用带有受限类型的TypeVar向函数添加类型

Python 使用带有受限类型的TypeVar向函数添加类型,python,type-hinting,typing,mypy,Python,Type Hinting,Typing,Mypy,从中,TypeVar用作泛型类型以及泛型函数定义的参数。它还允许我们限制泛型类型或函数的可能类型 如果我使用mypy运行下面的代码,它将正确地将y标识为int,将z标识为浮点 输入import TypeVar,任意 数组=类型变量(“数组”) X=TypeVar(“X”,int,float,str,complex) def标识(x:x)->x: 返回x 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': y=标识(5) z=标识(5.5) 显示类型(y) 显示

从中,
TypeVar
用作泛型类型以及泛型函数定义的参数。它还允许我们限制泛型类型或函数的可能类型

如果我使用mypy运行下面的代码,它将正确地将
y
标识为
int
,将
z
标识为
浮点

输入import TypeVar,任意
数组=类型变量(“数组”)
X=TypeVar(“X”,int,float,str,complex)
def标识(x:x)->x:
返回x
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
y=标识(5)
z=标识(5.5)
显示类型(y)
显示类型(z)
但是,如果我将
X
的定义更改为
X=TypeVar(“X”,int,float,str,complex,Any)
,那么从mypy得到的
y
z
的显示类型就是
Any

我的问题是:这是一个bug还是我错误地使用了
TypeVar
?如果TypeVar是错误的方法,我应该如何输入这个函数呢

有趣的是,如果我将
X
定义为
X=TypeVar(“X”,Any,int,float,str,complex)
,那么我会像以前一样得到
y
z
的正确显示类型,但是关于
TypeVar
的文档没有说明任何顺序,这可能只是一个实现细节,依赖它是很脆弱的。将
Any
放在
int、float之后,
会将
y
z
的类型显示为
complex
,这是错误的



注意:我实际上想添加到受约束类型中的是numpy数组,但由于它没有键入信息,mypy将其解释为仅
Any
,并且具有相同的效果。

为什么要将
Any
放在
TypeVar
定义中?包括一个类型意味着限制该类型,因此在这里使用
Any
意味着“X被限制为任何类型”。这只是在这个最小的示例中。我想添加的是numpy.ndarray类型,但由于它没有暗示它的类型,因此被解释为Any。有一个为numpy创建存根的项目,但是即使我添加存根,没有类型的任何其他库也会出现同样的问题。因此,我认为这个问题是有意义的。你可以为非类型的lib添加你自己的本地存根(它们不必是完整的,所以只定义你需要在代码中通过类型检查的内容),或者专门为类型检查别名未知类型(尽管在我看来,它在代码中并不总是很好看)。@hoefling这似乎是一个很好的长期解决方案,虽然我仍然认为TypeVar的行为很奇怪,我必须注意。为什么你要在
TypeVar
定义中加入
Any
?包括一个类型意味着限制该类型,因此在这里使用
Any
意味着“X被限制为任何类型”。这只是在这个最小的示例中。我想添加的是numpy.ndarray类型,但由于它没有暗示它的类型,因此被解释为Any。有一个为numpy创建存根的项目,但是即使我添加存根,没有类型的任何其他库也会出现同样的问题。因此,我认为这个问题是有意义的。你可以为非类型的lib添加你自己的本地存根(它们不必是完整的,所以只定义你需要在代码中通过类型检查的内容),或者专门为类型检查别名未知类型(尽管在我看来,它在代码中并不总是很好看)。@hoefling这似乎是一个很好的长期解决方案,尽管我仍然认为TypeVar的行为很奇怪,我必须注意一些事情。