Mon*_*eal 4 python type-hinting python-3.x mypy
我有一个函数,将不同长度的元组作为参数:
from typing import Tuple
def process_tuple(t: Tuple[str]):
# Do nasty tuple stuff
process_tuple(("a",))
process_tuple(("a", "b"))
process_tuple(("a", "b", "c"))
Run Code Online (Sandbox Code Playgroud)
当我注释上述函数时,出现这些错误消息
fool.py:9: error: Argument 1 to "process_tuple" has incompatible type "Tuple[str, str]"; expected "Tuple[str]"
fool.py:10: error: Argument 1 to "process_tuple" has incompatible type "Tuple[str, str, str]"; expected "Tuple[str]"
Run Code Online (Sandbox Code Playgroud)
process_tuple真正适用于元组,我将它们用作可变长度的不可变列表。我尚未在互联网上找到关于此主题的任何共识,因此我想知道该如何注释这种输入。
Bro*_*ark 14
使用tuple:
def process_tuple(t: tuple[str, ...]):
pass
Run Code Online (Sandbox Code Playgroud)
自 Python 3.9 起,typing.Tuple已弃用。状态的文档typing.Tuple:
自 3.9 版起已弃用:builtins.tuple现在支持
[].
如果您使用的是 Python 3.8 或更早版本,您仍然应该使用typing.Tuple:
from typing import Tuple
def process_tuple(t: Tuple[str, ...]):
pass
Run Code Online (Sandbox Code Playgroud)
我们可以使用...文字(aka Ellipsis)来注释可变长度的同类元组
def process_tuple(t: Tuple[str, ...]):
...
Run Code Online (Sandbox Code Playgroud)
之后错误应该消失。
来自文档
要指定同构类型的变长元组,请使用文字省略号,例如
Tuple[int, ...]。一个平原Tuple等同于Tuple[Any, ...],进而等同 于tuple。
除了 Azat 发布的省略号答案之外,您还可以通过使用@typing.overload或使其更加明确typing.Union
from typing import Tuple
@overload
def process_tuple(t: Tuple[str]):
# Do nasty tuple stuff
@overload
def process_tuple(t: Tuple[str, str]):
...
Run Code Online (Sandbox Code Playgroud)
或者与联盟:
from typing import Tuple, Union
def process_tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
# Do nasty tuple stuff
Run Code Online (Sandbox Code Playgroud)