我前几天第一次在一个类上实现了
在我看来,
再次看起来好像是
__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]
< p > in
运算符和直接调用__contains__
方法返回非常不同的输出:
>>> dum = Dummy()
>>> 7 in dum
True
>>> dum.__contains__(7)
[False, False]
再次看起来好像是
in
调用了__contains__
,但是将结果强制转换为bool
。我找不到这种行为的文档,除了__contains__
的文档说__contains__
只应该返回True
或False
之外。
我很高兴遵循惯例,但是有人能告诉我in
和__contains__
之间的确切关系吗?
结语
我决定选择@eli-korvigo的答案,但是每个人都应该查看@ashwini-chaudhary在下面的评论中关于错误的说明。
in
应该与__contains__
的返回值一致。 - Ashwini Chaudharyin
的具体实现,而是关心设计理念和明显缺乏文档。如果你发布这个答案,我会选择你的答案作为被接受的答案。 - joshua.r.smith