首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3.9+ typing.Collection vs tuple vs typing.Iterable

Python 3.9+ typing.Collection vs tuple vs typing.Iterable
EN

Stack Overflow用户
提问于 2021-06-01 18:17:36
回答 1查看 4K关注 0票数 8

typing.Collection的不同之处和用例是什么?

例如:

代码语言:javascript
复制
from typing import Collection, Iterable

foo: Collection[int] = (1, 2)
bar: Iterable[int] = (1, 2)
spam: tuple[int] = (1, 2)

至于我,一切看起来都一样,我不明白为什么不使用listtuple等作为类型提示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-01 18:27:47

这取决于您需要的对象的功能。我所遵循的关于类型规范的一般建议是

在输入时指定最一般的类型,在输出时指定最特定的类型。

如果您不需要具体的Tuple,就不要指定Tuple。除非您绝对需要元组,否则通过指定Tuple将使调用方的生活更加困难,因为您将迫使它们忽略提示,或者在集合之间进行转换,例如,如果它们当前有一个列表而不是一个元组。

下面是一个例子:

代码语言:javascript
复制
def func(tup: ???):
    for n in tup:
        pass

tup唯一的用途是迭代。这意味着,按照上述建议,您应该使用???填充Iterable。这样,调用者就可以给出他们的元组、列表,甚至是自定义类型。这并不重要,因为您的代码并不关心类型;只是对象是可迭代的。

与之形成对比的是:

代码语言:javascript
复制
def func(lst: ???):
    lst.append(1)
    lst[2] = 5

这需要更具体的功能,但仍然比list更通用。append__setitem__MutableSequence ABC的一部分,所以我会指定它。

在键入暗示输入时,我很少指定具体的集合类型。在绝大多数情况下,指定对象所需的功能集是很容易的。另外,对于元组,我只在希望用户输入成对序列或类似内容的情况下指定Tuple。假设我有一个函数,它接受一个可迭代的数字对。我会键入提示输入如下:

代码语言:javascript
复制
Iterable[Tuple[int, int]]

我现在使用Tuple (或tuple ),因为对的大小应该固定在两个。我可以接受一个数字列表,但我没有任何大小的“保证”。如果我要求元素的大小正好是两个,那么指定Tuple是实现这一目标的最干净的方法。

引用这张桌子,并选择最佳表示要对对象执行的操作的类型。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67794103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档