支持 `in` 运算符的最佳基类型?
Best base type which support `in` operator?
我有一个功能:
def f(a):
return 100 in a
我想注释参数a
,例如
from typing import List
def f(a: List[int]):
return 100 in a
但是支持 in
运算符的类型不仅是 list
,还有 set
或 tuple
(或者 dict
或 keyview
或其他东西)。
我的问题是:
什么类型最适合 a
,支持 in
运算符?
例如,提供此特定功能的最简单类型是什么?
好像typing.Container
或typing.Collection
都可以,但我不知道哪种最好。
我会选择Union[Container, Iterable]
。 python documentation for membership testing 声明它首先尝试 __contains__
然后尝试 __iter__
来确定成员资格。它还指出它尝试 __getitem__
都失败但仅针对旧式迭代。老实说,我不确定那是什么意思,但我认为我们可以安全地忽略它。
您的论点应尽可能通用。例如,如果您选择 Collection
将禁止生成器,因为它们不实现 len
,但生成器支持 in
关键字。
https://docs.python.org/3/library/collections.abc.html#collections.abc.Container
您应该使用通用 typing.Container
class,即 typing.Container[int]
。
这对应于 collections.abc.Container
,其文档是:
class collections.abc.Container
ABCs for classes that provide respectively the methods __contains__()
[...]
我有一个功能:
def f(a):
return 100 in a
我想注释参数a
,例如
from typing import List
def f(a: List[int]):
return 100 in a
但是支持 in
运算符的类型不仅是 list
,还有 set
或 tuple
(或者 dict
或 keyview
或其他东西)。
我的问题是:
什么类型最适合 a
,支持 in
运算符?
例如,提供此特定功能的最简单类型是什么?
好像typing.Container
或typing.Collection
都可以,但我不知道哪种最好。
我会选择Union[Container, Iterable]
。 python documentation for membership testing 声明它首先尝试 __contains__
然后尝试 __iter__
来确定成员资格。它还指出它尝试 __getitem__
都失败但仅针对旧式迭代。老实说,我不确定那是什么意思,但我认为我们可以安全地忽略它。
您的论点应尽可能通用。例如,如果您选择 Collection
将禁止生成器,因为它们不实现 len
,但生成器支持 in
关键字。
https://docs.python.org/3/library/collections.abc.html#collections.abc.Container
您应该使用通用 typing.Container
class,即 typing.Container[int]
。
这对应于 collections.abc.Container
,其文档是:
class collections.abc.Container
ABCs for classes that provide respectively the methods
__contains__()
[...]