支持`in`运算符的最佳基类型?

时间:2018-02-21 06:00:46

标签: python python-3.x typing

我有一个功能:

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没问题,但我不知道哪种类型最好

2 个答案:

答案 0 :(得分:1)

我会选择Union[Container, Iterable]。成员资格测试1的python文档指出它首先尝试__contains__然后尝试__iter__来确定成员资格。它还声明它尝试__getitem__两者都失败,但仅用于旧式迭代。说实话,我不确定这意味着什么,但我认为我们在这里可以安全地忽略它。

你的论点应该尽可能通用。如果您选择Collection会禁止生成器,因为它们没有实现len,但生成器支持in关键字。

https://docs.python.org/3/library/collections.abc.html#collections.abc.Container

答案 1 :(得分:1)

您应该使用通用的typing.Container类,即typing.Container[int]

这对应于collections.abc.Container,其文档为:

  

class collections.abc.Container

     

用于分别提供方法__contains__() [...]

的类的ABC