typing.Collection的不同之处和用例是什么?
例如:
from typing import Collection, Iterable
foo: Collection[int] = (1, 2)
bar: Iterable[int] = (1, 2)
spam: tuple[int] = (1, 2)至于我,一切看起来都一样,我不明白为什么不使用list、tuple等作为类型提示。
发布于 2021-06-01 18:27:47
这取决于您需要的对象的功能。我所遵循的关于类型规范的一般建议是
在输入时指定最一般的类型,在输出时指定最特定的类型。
如果您不需要具体的Tuple,就不要指定Tuple。除非您绝对需要元组,否则通过指定Tuple将使调用方的生活更加困难,因为您将迫使它们忽略提示,或者在集合之间进行转换,例如,如果它们当前有一个列表而不是一个元组。
下面是一个例子:
def func(tup: ???):
for n in tup:
passtup唯一的用途是迭代。这意味着,按照上述建议,您应该使用???填充Iterable。这样,调用者就可以给出他们的元组、列表,甚至是自定义类型。这并不重要,因为您的代码并不关心类型;只是对象是可迭代的。
与之形成对比的是:
def func(lst: ???):
lst.append(1)
lst[2] = 5这需要更具体的功能,但仍然比list更通用。append和__setitem__是MutableSequence ABC的一部分,所以我会指定它。
在键入暗示输入时,我很少指定具体的集合类型。在绝大多数情况下,指定对象所需的功能集是很容易的。另外,对于元组,我只在希望用户输入成对序列或类似内容的情况下指定Tuple。假设我有一个函数,它接受一个可迭代的数字对。我会键入提示输入如下:
Iterable[Tuple[int, int]]我现在使用Tuple (或tuple ),因为对的大小应该固定在两个。我可以接受一个数字列表,但我没有任何大小的“保证”。如果我要求元素的大小正好是两个,那么指定Tuple是实现这一目标的最干净的方法。
引用这张桌子,并选择最佳表示要对对象执行的操作的类型。
https://stackoverflow.com/questions/67794103
复制相似问题