如何注释多个 return 值的类型?

How to annotate types of multiple return values?

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

我很好奇,因为我想注释一个用于 return 多个值的函数 foo(),如下所示:

always_a_bool, always_a_str = foo()

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

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

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

Only Tuple 类型允许您指定固定数量 的元素,每个元素都有不同的类型。如果您的函数产生 固定 数量的 return 值,您真的应该始终 returning 一个元组,尤其是当这些值是特定的、不同的类型时。

其他序列类型预计会有一个类型规范用于可变数量的元素,所以typing.Sequence在这里不合适。另见 What's the difference between lists and tuples?

Tuples are heterogeneous data structures (i.e., their entries have different meanings), while lists are homogeneous sequences. Tuples have structure, lists have order.

Python的类型提示系统遵循这一理念,目前还没有语法来指定固定长度的迭代器并在特定位置包含特定类型。

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

-> Iterable[Union[bool, str]]

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

最后但同样重要的是,从 Python 3.9 开始,您可以使用

-> tuple[bool, str]

而不是-> Tuple[bool, str];支持完整列表的类型提示符号 has been added to most standard-library container types (see PEP 585)。事实上,从 Python 3.7 开始,您也可以使用它,前提是您使用模块的 from __future__ import annotations 编译器开关和支持语法的类型检查器。