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


110

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

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

always_a_bool, always_a_str = foo()

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



3
@ StevenM.Vascellaro这不是这个问题的重复
TWR

Answers:


159

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

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

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

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

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

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

如果必须指定任何可迭代的对象,那么最好的方法是:

-> Iterable[Union[bool, str]]

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


2
语言规范允许返回其他iterables; foo()可以yield True; yield "blah"并且a, b = foo()仍然可以工作。或者foo()可以返回列表。我改写了我的问题,以明确表明我有兴趣暗示一个任意的可迭代对象,而不是一个元组。
理查德·汉森

2
@RichardHansen:我重新检查的PEP和文件typing,并mypy自发布另2倍; 我非常有信心我什么都不会错过。就是说,SO上有几位常客,他们具有大量的Python类型提示经验,如果发现错误,会毫不犹豫地纠正我,否则会给出更好的答案。
马丁·彼得斯

21
我必须添加from typing import Tuple元组注释才能正常工作。
PHPirate

3
@PHPirate:是的,您必须对Iterable和进行相同的操作Union。由于我们在这里讨论它们的特定用途,因此暗含了导入。
马丁·彼得斯

6
@MartijnPieters,谢谢您的出色回答,但是我认为PHPirate的评论值得编辑为您的原始答案。
Tim Mironov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.