支持 `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,还有 settuple(或者 dictkeyview或其他东西)。

我的问题是:

什么类型最适合 a,支持 in 运算符?
例如,提供此特定功能的最简单类型是什么?

好像typing.Containertyping.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__() [...]