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

Ric*_*sen 45 python type-hinting python-3.x python-3.5

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

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

always_a_bool, always_a_str = foo()
Run Code Online (Sandbox Code Playgroud)

通常函数喜欢foo()做这样的事情return a, b(它返回一个元组),但我喜欢的类型暗示有足够的灵活性,以取代发电机或列表或别的东西返回的元组.

Mar*_*ers 57

你总是返回一个物体; 使用return one, two简单地返回一个元组.

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

只有Tuple类型允许您指定固定数量的元素,每个元素都具有不同的类型.如果函数产生固定数量的返回值,尤其是当这些值是特定的不同类型时,您确实应该返回一个元组.

对于可变数量的元素,期望其他序列类型具有一种类型规范,因此typing.Sequence这里不适合.另请参阅列表和元组之间的区别是什么?

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

Python的类型提示系统遵循该原理,目前没有语法来指定固定长度的可迭代并且在特定位置包含特定类型.

如果必须指定任何iterable都可以,那么您可以做的最好的事情是:

-> Iterable[Union[bool, str]]
Run Code Online (Sandbox Code Playgroud)

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

  • 我必须从键入import Tuple中添加`来使Tuple注释起作用。 (6认同)
  • 为了在 python 3.8 中运行此代码,您可能必须添加“fromtypes import Tuple, List” (5认同)
  • @PHPirate:是的,你必须为`Iterable`和`Union`做同样的事情.由于我们在此讨论它们的具体用途,因此暗示了重要性. (3认同)
  • [语言规范](https://docs.python.org/3/reference/simple_stmts.html#assignment-statements)允许返回其他迭代; `foo()`可以'产生真; 屈服"blah"`和`a,b = foo()`仍然有效.或者``foo()`可以返回一个列表.我重写了我的问题,以明确表示我有兴趣暗示一个任意的迭代,而不是一个元组. (2认同)
  • @RichardHansen:很可能是这样,但是类型提示只为您提供“Tuple”来表达异构的、固定长度的返回值。 (2认同)
  • “你想要的是不可能的”是一个很好的答案,假设它是正确的。:) (2认同)
  • @RichardHansen:自发布以来,我又重新检查了 2 次 PEP 和 `typing` 和 `mypy` 的文档;我很自信我没有错过任何东西。也就是说,SO 上有几个常客拥有大量 Python 类型提示经验,如果结果证明是错误的,他们会毫不犹豫地纠正我,或者会发布更好的答案。 (2认同)