如何注释类型的多个返回值?

我如何使用类型提示来注释一个函数,返回一个Iterable,总是产生两个值:一个bool和一个str?提示Tuple[bool, str]是接近的,除了它将返回值类型限制为元组,而不是生成器或其他类型的可迭代对象。

我很好奇,因为我想注释一个函数foo(),它用于返回多个值,就像这样:

always_a_bool, always_a_str = foo()

通常像foo()这样的函数会做一些类似return a, b的事情(返回一个元组),但我希望类型提示足够灵活,可以用生成器或列表或其他东西替换返回的元组。

175572 次浏览

你总是返回一个对象;使用return one, two只是返回一个元组。

所以是的,-> Tuple[bool, str]是完全正确的。

只有 Tuple类型允许你指定元素的固定数量,每个元素都有不同的类型。如果你的函数产生了固定个数的返回值,特别是当这些值是特定的、不同的类型时,你真的应该总是返回一个元组。

其他序列类型预期具有一个类型规范,用于可变数量的元素,因此typing.Sequence不适合在这里使用。也可参见列表和元组之间的区别是什么?

元组是异构数据结构(即,它们的条目有不同的含义),而列表是同构序列。元组有结构,列表有顺序。

Python的类型提示系统坚持这一理念,目前没有语法来指定一个固定长度的可迭代对象,并在特定位置包含特定类型。

如果你必须指定任何可迭代对象都可以,那么你能做的最好的是:

-> Iterable[Union[bool, str]]

此时调用者可以期望布尔值和字符串以任何顺序排列,并且长度未知(在0到无穷之间的任何位置)。

最后但并非最不重要的是,从Python 3.9开始,您可以使用

-> tuple[bool, str]

而不是-> Tuple[bool, str];支持类型提示符号已添加到大多数标准库容器类型(完整列表见PEP 585)。事实上,你也可以从Python 3.7开始使用它,只要你为你的模块使用from __future__ import annotations编译器开关和支持该语法的类型检查器。