Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何注释接受可变长度元组的函数?(可变元组类型注释)_Python_Python 3.x_Type Hinting_Mypy - Fatal编程技术网

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:so
Tuple[str]
是一个单一的
str
-object
Tuple
,而
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