Python 3.9+ typing.Collection 对比元组对比 typing.Iterable
Python 3.9+ typing.Collection vs tuple vs typing.Iterable
typing.Collection
的区别和用例是什么?
例如:
from typing import Collection, Iterable
foo: Collection[int] = (1, 2)
bar: Iterable[int] = (1, 2)
spam: tuple[int] = (1, 2)
至于我,一切看起来都一样,我不明白为什么不总是使用 list
、tuple
等作为类型提示。
这取决于您需要的对象的功能。我遵循的关于类型规范的一般建议是
Specify the most general type when taking input, and the most specific type when giving output
如果您不需要 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
是实现此目的的最简洁方法。
参考 this chart,然后选择最能代表您要对对象执行的操作的类型。
typing.Collection
的区别和用例是什么?
例如:
from typing import Collection, Iterable
foo: Collection[int] = (1, 2)
bar: Iterable[int] = (1, 2)
spam: tuple[int] = (1, 2)
至于我,一切看起来都一样,我不明白为什么不总是使用 list
、tuple
等作为类型提示。
这取决于您需要的对象的功能。我遵循的关于类型规范的一般建议是
Specify the most general type when taking input, and the most specific type when giving output
如果您不需要 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
是实现此目的的最简洁方法。
参考 this chart,然后选择最能代表您要对对象执行的操作的类型。