【发布时间】:2016-11-27 07:22:57
【问题描述】:
前几天我第一次在一个类上实现了__contains__ 方法,结果出乎我的意料。我怀疑 in 运算符有一些我不理解的微妙之处,我希望有人能启发我。
在我看来,in 运算符不只是包装对象的__contains__ 方法,而且它还试图将__contains__ 的输出强制为布尔值。例如,考虑类
class Dummy(object):
def __contains__(self, val):
# Don't perform comparison, just return a list as
# an example.
return [False, False]
in 运算符和对__contains__ 方法的直接调用返回非常不同的输出:
>>> dum = Dummy()
>>> 7 in dum
True
>>> dum.__contains__(7)
[False, False]
再次,看起来in 正在调用__contains__,但随后将结果强制转换为bool。除了__contains__ documentation 说__contains__ 应该只返回True 或False 之外,我在任何地方都找不到这种行为。
我很高兴遵守约定,但有人能告诉我in 和__contains__ 之间的确切关系吗?
结语
我决定选择@eli-korvigo 答案,但大家应该看看@ashwini-chaudhary comment 关于bug,下面。
【问题讨论】:
-
因为你的 contains-method 返回等效于 bool([False, False])
-
@AshwiniChaudhary:你能写下这个评论作为答案吗?就一个单线左右就可以了。我从未见过这个错误报告,它准确地回答了我的问题。我不太关心
in的具体实现,因为我关心设计推理和明显缺乏文档。如果您发布此答案,我将选择您的答案作为接受的答案。
标签: python python-2.7 contains