Wenn ein Objekt keine __contains__
Implementierung hat, wird in
auf einen Standard zurückgegriffen, der im Grunde so funktioniert:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
Und wenn ein Objekt keine __iter__
Implementierung hat, greift es for
auf einen Standard zurück, der im Grunde so funktioniert:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
Diese Standardeinstellungen werden auch dann verwendet, wenn das Objekt keine Sequenz sein soll.
Ihre 1 in f
und 5 in f
Tests verwenden die Standard-Fallbacks für in
und for
, was zu dem beobachteten Verhalten führt. 1 in f
findet 1
sofort, aber du kommst __getitem__
nie zurück 5
, 5 in f
läuft also für immer.
(Nun, tatsächlich __iter__
speichert der Standard- Fallback bei der Referenzimplementierung von Python den Index in einer Variablen vom Typ C. Py_ssize_t
Wenn Sie also lange genug warten, wird diese Variable maximal und Python löst einen OverflowError aus . Wenn Sie das gesehen haben, haben Sie muss sich auf einem 32-Bit-Python-Build befinden. Computer haben nicht lange genug existiert, damit jemand dies auf einem 64-Bit-Python erreichen kann.)
for
undin
vor der Einführung von__iter__
und__contains__
. Lesen Sie hier und hier die Python 1.4-Dokumentation .