精简版
tuple[int, ...]
是 python 3.9+ 中的有效类型,但 mypy
拒绝为此使用类型别名。例如。考虑:
Thing = tuple[int, ...]
这会导致“error: Unexpected '...'
”(尽管 python 本身会很好地加载模块)。
这是 mypy
中的错误吗?
我应该/可以做什么?我想也许我可以只使用 NewType
来代替,但同样失败了。
长版
Python 3.9 包含 PEP 585 ,这意味着我们可以使用内置类型,例如 list
、set
和 tuple
作为泛型;因此,typing
中的版本现已弃用(例如,参见 docs for typing.Tuple)。
mypy
0.800 introduced support for this ,所以现在我可以编写以下内容,mypy
将对其进行正确的类型检查:
def foo(a: tuple[int, str]):
...
现在,tuple
(和typing.Tuple
)当然有一种特殊形式用于未知长度的同质类型元组:tuple[int, .. .]
;这也很好用:
def foo(a: tuple[int, ...]):
...
方便地,we can create aliases for types ,所以这也适用:
from typing import Tuple
Thing = Tuple[int, ...]
def foo(a: Thing):
...
不幸的是,以下(将 元组
、...
形式和类型别名放在一起)不 起作用:
Thing = tuple[int, ...]
def foo(a: Thing):
...
相反,这被 mypy
(v0.812) 拒绝并显示消息“error: Unexpected '...'
”
然而,Python 本身可以加载并运行这样的模块。
我还没有(还)能够找到任何表明这不应该是可能的事情。所以:
我错过了什么吗?这样的类型别名实际上是被禁止的吗?
如果不是,这是
mypy
中的错误吗?有没有比使用NewType
而不是别名更好的方法来解决这个问题?我认为使用
NewType
可以解决这个问题(需要一些额外的工作)但它似乎以完全相同的方式失败。所以现在似乎没有办法编写这些类型并让mypy
开心。
最佳答案
啊哈,看起来像 it is indeed an open mypy bug .
所以现在唯一的问题(直到修复/发布)是如何解决它?可能我不得不咬住 NewType
子弹。 :-/
编辑:有趣的是,Thing = NewType('Thing', tuple[int, ...])
以完全相同的方式失败。
关于python - 在 python 3.9+ 中,如何使用省略号为内置元组类型编写类型别名? (mypy 错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67339372/