我在某個類上第一次實現了__contains__
方法,這種行爲並非我所期望的。我懷疑有一些微妙的問題,我不明白,我希望有人能夠啓發我。Python`in`與`__contains__`的功能
在我看來,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__
之間的確切關係嗎?
尾聲
我決定選擇@禮 - korvigo答案,但每個人都應該看看@阿什維尼 - 喬杜裏comment有關bug,以下。
因爲你的contains方法返回等價於bool([False,False]) – x1Mike7x
相關bug:['in'應該與'__contains__'的返回值一致](https://bugs.python.org/issue16011 ) –
@AshwiniChaudhary:你能寫這個評論作爲答案嗎?只是一行一行就好了。我從來沒有見過這個錯誤報告,它正好回答了我的問題。我並不關心'in'的具體實現,因爲我關心設計推理和明顯缺乏文檔。如果你發佈這個答案,我會選擇你的答案作爲接受的答案。 –