【问题标题】:How to annotate types of multiple return values?如何注释多个返回值的类型?
【发布时间】:2017-03-04 01:01:02
【问题描述】:

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

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

always_a_bool, always_a_str = foo()

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

【问题讨论】:

标签: python python-3.x python-3.5 type-hinting python-typing


【解决方案1】:

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

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

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

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

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

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

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

-> Iterable[Union[bool, str]]

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

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

-> tuple[bool, str]

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

【讨论】:

  • language specification 允许返回其他可迭代对象; foo() 可以做到 yield True; yield "blah"a, b = foo() 仍然可以工作。或者foo() 可以返回一个列表。我改写了我的问题,以表明我有兴趣暗示任意可迭代,而不是元组。
  • @RichardHansen:可能是这样,但类型提示只为您提供Tuple 来表达一个异构的、固定长度的返回值。
  • “你想要的不可能”是一个很好的答案,假设它是正确的。 :)
  • @RichardHansen:我已经重新检查了typingmypy 的 PEP 和文档,自发布以来又重复了 2 次;我很自信我没有错过任何东西。也就是说,这里有几位常客,他们拥有丰富的 Python 类型提示经验,如果发现错误,他们会毫不犹豫地纠正我,或者会发布更好的答案。
  • 从 Python 3.9 开始,typing.Tuple 已被弃用,内置的tuple 现在支持使用[] 进行类型注释,因此您可以编写-> tuple[bool str]docs.python.org/3.9/library/typing.html#typing.Tuple
猜你喜欢
  • 2022-11-15
  • 2011-08-03
  • 2017-02-10
  • 2021-08-03
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多