Python 如何注释接受可变长度元组的函数?(可变元组类型注释)
我有一个函数,它将不同长度的元组作为参数:Python 如何注释接受可变长度元组的函数?(可变元组类型注释),python,python-3.x,type-hinting,mypy,Python,Python 3.x,Type Hinting,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")) 当我注释上面提到的函数时,我会得到这些错误消息 fool.py:9: error: Argument 1 to "p
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\u tuple
确实适用于tuple,我将它们用作可变长度的不可变列表。我在互联网上还没有找到任何关于这个话题的共识,所以我想知道我应该如何注释这种输入 可变长度同质元组我们可以使用…
文本(aka省略号
)进行注释,如
在那之后,错误应该消失了
从
要指定同构类型的可变长度元组,请使用literal
省略号,例如元组[int,…]
。普通的元组
相当于
Tuple[Any,…]
,然后依次转到Tuple
除了Azat发布的省略号答案外,您还可以使用或使其更加明确 或与工会:
from typing import Tuple, Union
def process_tuple(t: Union[Tuple[str], Tuple[str, str], Tuple[str, str, str]]):
# Do nasty tuple stuff
我知道这一点,但我的元组可能非常长,所以这不是一个选项。无论如何,谢谢。顺便说一句,重载应该在实现之前执行。运行代码时,您是否遇到这些错误?我运行代码时没有出现任何错误。我在运行
mypy
时出现这些错误。这实际上有点违反直觉和逻辑。如果我们假设List[str]
适用于可变长度列表,那么为什么Tuple[str]
不适用于可变长度Tuple呢?和(type(((“a”,“a”))==type((“a”,“a”,“a”))
产生True
@Montreal:这是因为元组和列表的用途不同:元组是异构容器(就像RDBMS中任意函数或单个表记录的位置参数,或者在数学世界中——不同集合的笛卡尔积元素(或笛卡尔积的并集),因此每个坐标可能有不同的类型,但它们的数量通常是固定的),而list
s是同质的(就像同一个表记录的集合或某个集合元素的有限序列)@Montreal:soTuple[str]
是一个单一的str
-objectTuple
,而List[str]
是任意数量的str
对象的集合
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