233

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

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

always_a_bool, always_a_str = foo()

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

4

1 回答 1

313

你总是返回一个对象;usingreturn 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为你的模块使用编译器开关和一个支持语法的类型检查器。

于 2016-10-21T16:23:58.487 回答