在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]