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的行为很奇怪,我必须注意一些事情。