在python 3.9+;中;,如何为带省略号的内置元组类型编写类型别名?(MypyBug?) 短版
在python 3.9+;中;,如何为带省略号的内置元组类型编写类型别名?(MypyBug?) 短版,python,types,mypy,typing,python-3.9,Python,Types,Mypy,Typing,Python 3.9,tuple[int,…]在python 3.9+中是有效的类型,但mypy拒绝使用该类型的类型别名。例如,考虑: Thing = tuple[int, ...] 这将导致“错误:意外的“…””(尽管python本身可以很好地加载模块) 这是mypy中的错误吗 我应该/可以做什么?我想也许我可以用NewType来代替,但同样失败了 长版本 Python3.9合并了,这意味着我们可以使用内置类型,例如list、set和tuple,作为泛型;因此,键入中的版本现在已被弃用(例如,请参阅) mypy0
tuple[int,…]
在python 3.9+中是有效的类型,但mypy
拒绝使用该类型的类型别名。例如,考虑:
Thing = tuple[int, ...]
这将导致“错误:意外的“…”
”(尽管python本身可以很好地加载模块)
这是mypy中的错误吗
我应该/可以做什么?我想也许我可以用NewType
来代替,但同样失败了
长版本
Python3.9合并了,这意味着我们可以使用内置类型,例如list
、set
和tuple
,作为泛型;因此,键入
中的版本现在已被弃用(例如,请参阅)
mypy
0.800,因此现在我可以编写以下内容,mypy
将正确地进行键入检查:
def foo(a: tuple[int, str]):
...
现在,tuple
(和typing.tuple
)当然有一种特殊的形式来表示长度未知的同源类型的tuple:tuple[int,…]
;这也很好:
def foo(a: tuple[int, ...]):
...
很容易,所以这也很有效:
from typing import Tuple
Thing = Tuple[int, ...]
def foo(a: Thing):
...
不幸的是,以下内容(将元组
、..
表单和类型别名放在一起)不起作用:
Thing = tuple[int, ...]
def foo(a: Thing):
...
相反,mypy
(v0.812)会拒绝该请求,并显示消息“错误:意外”…”
”
然而,Python本身可以很好地加载和运行这样的模块
我还没有找到任何迹象表明这是不可能的。因此:
- 我错过什么了吗?这样的类型别名实际上是被禁止的吗
- 如果不是,这是
中的错误吗mypy
- 除了使用
而不是别名之外,还有什么更好的解决方法吗 我原以为使用NewType
可以解决这个问题(需要一些额外的工作),但它似乎以完全相同的方式失败。因此,现在似乎没有办法编写这些类型并保持NewType
快乐mypy
- 啊哈,看起来像
因此,现在唯一的问题(在修复/发布之前)是如何解决它?可能我得咬紧牙关了-/
编辑:有趣的是,
Thing=NewType('Thing',tuple[int,…])
以完全相同的方式失败。我是否错误地认为你可以使用tuple[int]
,这将被视为等价物?@MarcelWilson这是一个单重元组,与tuple[int,…],这是一个非固定大小的整数元组。这让我觉得是mypy中的一个bug。@Carcigenicate是的,我刚刚发现它是mypy问题9980:-我本以为在发布问题之前我已经做了研究,但后来我挖得更深了一点,它就在那里……你真的需要将参数限制在元组
,而不是使用序列[int]
?