Bir nesnenin bir __contains__
uygulaması yoksa in
, temelde şu şekilde çalışan bir varsayılana geri döner:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
Ve bir nesnenin bir __iter__
uygulaması yoksa for
, temelde şu şekilde çalışan bir varsayılana geri döner:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
Bu varsayılanlar, nesne bir dizi olarak tasarlanmamış olsa bile kullanılır.
Sizin 1 in f
ve 5 in f
testler için öntanımlı seçenekler kullanıyor in
ve for
gözlenen davranış yol. derhal 1 in f
bulur 1
, ama __getitem__
asla geri gelmez 5
, bu yüzden 5 in f
sonsuza dek çalışır.
(Aslında, Python'un referans uygulamasında, varsayılan __iter__
geri dönüş, dizini C düzeyi bir değişkente saklar Py_ssize_t
, bu nedenle yeterince beklerseniz, bu değişken en üst düzeye çıkar ve Python bir OverflowError'ı yükseltir . Bilgisayarlar 32 bit Python derlemesinde olmalıdır. Bilgisayarlar, 64 bit Python'da kimsenin buna çarpması için yeterince uzun süredir mevcut değildir.)