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

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

always_a_bool, always_a_str = foo()

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


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

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

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

其他序列类型期望对可变数量的元素有一种类型规范,因此类型。顺序在这里不合适。另参见列表和元组之间的区别是什么?

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

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

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

-> Iterable[Union[bool, str]]

此时调用者可以期望布尔值和任意顺序的字符串,长度未知(从0到无穷大)。

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

-> tuple[bool, str]

->元组[bool, str];对类型提示符号的支持已添加到大多数标准库容器类型中(有关完整列表,请参阅PEP 585)。事实上,你也可以从Python 3.7开始使用它,只要你为你的模块使用from __future__导入注释编译器开关和支持语法的类型检查器。