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

374

我该如何使用类型提示为一个返回总是包含两个值(一个布尔型和一个字符串)的Iterable的函数进行注释?提示Tuple[bool, str]接近于要求,但它仅限于返回元组类型,而不是生成器或其他类型的可迭代对象。

我主要好奇的是因为我想为一个像这样返回多个值的foo()函数进行注释:

always_a_bool, always_a_str = foo()

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


可能是如何使用类型提示指定多个返回类型的重复内容。 - Stevoisiak
12
@StevenM.Vascellaro 这不是那个问题的重复。 - T.W.R. Cole
相关:https://dev59.com/B1MH5IYBdhLWcg3w0jiF - Nav
1个回答

514

你始终只返回一个对象;使用return one, two将简单地返回一个元组。

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

只有Tuple类型允许您指定固定数量的元素,每个元素都具有不同的类型。如果您的函数生成固定数量的返回值,并且这些值是特定的、不同的类型,那么您应该总是返回元组。

其他序列类型预期具有变量数量的一个类型规范,因此在这里不适用typing.Sequence。另请参见列表和元组之间的区别是什么?

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

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

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

-> Iterable[Union[bool, str]]

在这一点上,调用者可以期望布尔值和字符串以任意顺序出现,并且长度未知(可以是0到无穷大)。

最后但并非最不重要的,在Python 3.9中,您可以使用

-> tuple[bool, str]

现在支持使用类型提示符号来标注大多数Python标准库中的容器类型,而不是使用-> Tuple[bool, str]。具体详情请参见Python 3.9 新特性以及PEP 585。实际上,从 Python 3.7 开始,只要你为模块使用from __future__ import annotations编译开关并且使用支持此语法的类型检查器,就可以使用这种语法。


5
语言规范允许返回其他可迭代对象;foo() 可以执行 yield True; yield "blah",而且 a, b = foo() 仍然可以正常工作。或者 foo() 可以返回一个列表。我重新措辞了我的问题,以明确表达我对提示任意可迭代对象的兴趣,而不是元组。 - Richard Hansen
2
@RichardHansen:这可能是正确的,但类型提示仅提供了Tuple来表示异构的、固定长度的返回值。 - Martijn Pieters
5
“你想要的是不可能的”是一个很好的回答,假设这是正确的。 :) - Richard Hansen
4
@RichardHansen:我在发布后已经再次检查了typingmypy的PEP和文档两次;我相当有信心没有漏掉任何东西。话虽如此,在这里有几个经验丰富的Python类型提示常客,如果我错了,他们不会犹豫地纠正我,或者他们会发表一个更好的答案。 - Martijn Pieters
5
为了在 Python 3.8 中运行此代码,您可能需要添加以下代码: from typing import Tuple, List - Joel
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接