Python 3.9+打字。集合与元组与打字.Iterable

问题描述 投票:0回答:1

typing.Collection
有什么区别和用例?

例如:

from typing import Collection, Iterable

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

对于我来说,一切看起来都一样,我不明白为什么不总是使用

list
tuple
等作为类型提示。

python python-3.x python-typing
1个回答
26
投票

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

接受输入时指定最通用的类型,给出输出时指定最具体的类型

如果您不需要专门指定

Tuple
,则不要指定
Tuple
。除非你绝对需要一个元组,否则通过指定
Tuple
会让调用者的生活变得更加困难,因为你将迫使他们要么忽略你的提示,要么在集合之间进行转换(如果他们当前有一个列表而不是一个集合)元组。

这是一个例子:

def func(tup: ???):
    for n in tup:
        pass

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

将其与以下内容进行对比:

def func(lst: ???):
    lst.append(1)
    lst[2] = 5

这需要更具体的功能;但仍然比

list
更通用。
append
__setitem__
MutableSequence
ABC 的一部分,所以我会指定这一点。

我很少在类型提示输入时指定具体的集合类型。大多数时候,指定对象所需的一小部分功能很容易。另外,对于元组,我仅在希望用户输入成对序列或类似内容的情况下指定

Tuple
。假设我有一个接受可迭代的数字对的函数。我会输入提示,输入为:

Iterable[Tuple[int, int]]

我使用

Tuple
(或现在的
tuple
),因为对的大小应固定为恰好两个。我可以接受一系列数字,但我没有任何大小“保证”。如果我要求元素的大小恰好为 2,则指定
Tuple
是实现这一目标的最简洁方法。

参考此表,然后选择最能代表您要对对象执行的操作的类型。

© www.soinside.com 2019 - 2024. All rights reserved.