如何在python中注释带有可变长度元组的函数?

问题描述 投票:3回答:2

我有一个函数,它将一个不同长度的元组作为参数:

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真的与元组一起使用,我将它们用作可变长度的不可变列表。我没有在互联网上找到关于这个主题的任何共识,所以我想知道我应该如何注释这种输入。

python python-3.x type-hinting mypy
2个回答
8
投票

我们可以使用... literal(aka Ellipsis)注释可变长度的同质元组

def process_tuple(t: Tuple[str, ...]):
    ...

之后,错误应该消失。

来自docs

要指定同类型的可变长度元组,请使用文字省略号,例如, Tuple[int, ...]。一个普通的Tuple相当于Tuple[Any, ...],而相当于tuple


1
投票

除了Azat发布的省略号答案之外,您可以通过使用@typing.overloadtyping.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
© www.soinside.com 2019 - 2024. All rights reserved.