如何注释采用可变长度元组的函数? (可变元组类型注解)

新手上路,请多包涵

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

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

原文由 Montreal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 508
2 个回答

我们可以使用 ... 文字(又名 Ellipsis )来注释可变长度的同构元组,如下所示:

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

或者对于 Python3.9+

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

之后,错误应该消失了。

文档

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

原文由 Azat Ibrakov 发布,翻译遵循 CC BY-SA 4.0 许可协议

除了 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

原文由 Wolph 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题