微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python 3.9+中,如何用省略号为内置元组类型编写类型别名? 我的错误?

如何解决在python 3.9+中,如何用省略号为内置元组类型编写类型别名? 我的错误?

短版

<table style="width:100%" class="table table-striped"> <tr> <td><strong>First Name</strong></td> <td>Test Name</td> <td><a class="btn btn-success" href="#">Edit</a></td> </tr> <tr> <td><strong>Last Name</strong></td> <td>Test Name</td> <td><a class="btn btn-success" href="#">Edit</a></td> </tr> <tr> <td><strong>Username</strong></td> <td>test_username</td> <td><a class="btn btn-success" href="#">Edit</a></td> </tr> </table> 是 python 3.9+ 中的有效类型,但 tuple[int,...] 拒绝使用类型别名。例如。考虑:

mypy

这会导致“Thing = tuple[int,...] ”(尽管 python 本身会很好地加载模块)。

这是 error: Unexpected '...' 中的错误吗?

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

长版

Python 3.9 包含 PEP 585,这意味着我们可以使用内置类型,例如 NewTypelistset 作为泛型;因此,tuple 中的版本现已弃用(例如,请参阅 docs for typing.Tuple)。

typing 0.800 introduced support for this,所以现在我可以编写以下内容mypy 会正确地进行类型检查:

mypy

现在,def foo(a: tuple[int,str]): ... (和tuple)对于未知长度的同构元组当然有一种特殊的形式:typing.Tuple;这也很好用:

tuple[int,...]

方便,we can create aliases for types,所以这也有效:

def foo(a: tuple[int,...]):
    ...

不幸的是,以下(将 from typing import Tuple Thing = Tuple[int,...] def foo(a: Thing): ... tuple 形式和类型别名放在一起)不起作用

...

相反,这被 Thing = tuple[int,...] def foo(a: Thing): ... (v0.812) 拒绝并带有消息“mypy

不过,Python 本身可以很好地加载和运行这样的模块。

我还没有(还)找到任何表明这是不可能的。所以:

  • 我错过了什么吗?这样的类型别名实际上是被禁止的吗?

  • 如果不是,这是 error: Unexpected '...' 中的错误吗?

  • 除了使用 mypy 而不是别名之外,还有什么更好的方法可以解决这个问题?

    我认为使用 NewType 可以解决这个问题(需要一些额外的工作),但它似乎以完全相同的方式失败。所以现在似乎没有办法编写这些类型并让 NewType 开心。

解决方法

啊哈,看起来像it is indeed an open mypy bug

所以现在唯一的问题(直到修复/发布)是如何解决它?可能我不得不咬紧牙关NewType。 :-/


编辑:有趣的是,Thing = NewType('Thing',tuple[int,...]) 以完全相同的方式失败。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。