如何解决在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,这意味着我们可以使用内置类型,例如 NewType
、list
和 set
作为泛型;因此,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 举报,一经查实,本站将立刻删除。