Ich habe die Methode zum ersten Mal am anderen Tag implementiert, und das Verhalten war nicht das, was ich erwartet hatte. Ich vermute, es gibt etwas Subtilität für den Operator, den ich nicht verstehe, und ich hoffte, dass jemand mich erleuchten könnte.Funktionalität von Python `in` vs.` __contains__`
Es scheint mir, dass der Operator in
nicht einfach die Methode eines Objekts umschließt, aber es versucht auch, die Ausgabe von auf Boolean zu erzwingen. Betrachten wir zum Beispiel die Klasse
class Dummy(object):
def __contains__(self, val):
# Don't perform comparison, just return a list as
# an example.
return [False, False]
Der in
Operator und einen direkten Aufruf der __contains__
Methode Rückkehr sehr unterschiedlichen Ausgangs:
>>> dum = Dummy()
>>> 7 in dum
True
>>> dum.__contains__(7)
[False, False]
Auch hier sieht es aus wie in
wird __contains__
Aufruf aber dann das Ergebnis Nötigung zu bool
. Ich kann dieses Verhalten nirgends außer der Tatsache dokumentiert finden, dass die documentation sagt sollte immer nur True
oder False
zurückgeben.
Ich bin glücklich, die Konvention zu folgen, aber kann mir jemand die genaue Beziehung zwischen in
und sagen?
Epilog
entschied ich @ eli-korvigo Antwort zu wählen, aber jeder an @ ashwini-chaudhary comment über die bug unten aussehen sollte.
Da Ihre contains-Methode das Äquivalent von bool ([False, False]) zurückgibt – x1Mike7x
Zugehöriger Fehler: ['in' sollte konsistent sein mit dem Rückgabewert von' __contains__'] (https://bugs.python.org/issue16011) –
@AshwiniChaudhary: Können Sie diesen Kommentar als Antwort schreiben? Nur ein Einzeiler oder so ist in Ordnung. Ich habe diesen Fehlerbericht noch nie gesehen und er beantwortet meine Frage genau. Ich kümmere mich nicht so sehr um die spezifische Umsetzung von "in", da mir das Design-Argument und der offensichtliche Mangel an Dokumentation wichtig sind. Wenn Sie diese Antwort posten, wähle ich Ihre Antwort als die akzeptierte aus. –