我有一个功能:
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
没问题,但我不知道哪种类型最好。
答案 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
用于分别提供方法
的类的ABC__contains__()
[...]