python - 在 python 3.9+ 中,如何使用省略号为内置元组类型编写类型别名? (mypy 错误?)

标签 python types type-hinting mypy python-3.9

精简版

tuple[int, ...] 是 python 3.9+ 中的有效类型,但 mypy 拒绝为此使用类型别名。例如。考虑:

Thing = tuple[int, ...]

这会导致“error: Unexpected '...'”(尽管 python 本身会很好地加载模块)。

这是 mypy 中的错误吗?

我应该/可以做什么?我想也许我可以只使用 NewType 来代替,但同样失败了。

长版

Python 3.9 包含 PEP 585 ,这意味着我们可以使用内置类型,例如 listsettuple 作为泛型;因此,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/

相关文章:

python - pyCharm:未解析的引用 "MIMEMultipart"

go - 自定义 slice 类型和底层类型之间的分配

c# - ushort 等价物

python - 如何键入具有封闭类类型的提示方法?

Python:递归isinstance检查

python - 如何用pandas中的条件替换两列?

使用 Pygame 的 Python Pong 游戏

python3 输入 : extract argument list from Callable

python - 从 Anaconda 2 迁移到 Anaconda 3 和虚拟环境

asp.net - 我应该如何检测 ASP.NET 中上传文件的 MIME 类型?