我有一个函数,它将一个不同长度的元组作为参数:
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"))
当我注释上面提到的函数时,我收到这些错误消息
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]"
process_tuple
真的与元组一起使用,我将它们用作可变长度的不可变列表。我没有在互联网上找到关于这个主题的任何共识,所以我想知道我应该如何注释这种输入。
我们可以使用...
literal(aka Ellipsis
)注释可变长度的同质元组
def process_tuple(t: Tuple[str, ...]):
...
之后,错误应该消失。
来自docs
要指定同类型的可变长度元组,请使用文字省略号,例如,
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]):
...
或者与联盟:
from typing import Tuple, Union
def process_tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
# Do nasty tuple stuff