Jika suatu objek tidak memiliki __contains__
implementasi, in
kembali ke default yang pada dasarnya bekerja seperti ini:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
Dan jika suatu objek tidak memiliki __iter__
implementasi, for
kembali ke default yang pada dasarnya bekerja seperti ini:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
Default ini digunakan bahkan jika objek tidak dimaksudkan sebagai urutan.
Tes Anda 1 in f
dan 5 in f
menggunakan fallback default untuk in
dan for
, yang mengarah ke perilaku yang diamati. segera 1 in f
ditemukan 1
, tetapi Anda __getitem__
tidak pernah kembali 5
, jadi 5 in f
jalankan selamanya.
(Ya, sebenarnya, pada implementasi referensi Python, __iter__
fallback default menyimpan indeks dalam tipe variabel level-C Py_ssize_t
, jadi jika Anda menunggu cukup lama, variabel itu akan keluar dan Python memunculkan OverflowError . Jika Anda melihatnya, Anda harus menggunakan Python build 32-bit. Komputer belum ada cukup lama bagi siapa pun untuk menekan itu pada Python 64-bit.)
for
danin
, sebelum pengenalan__iter__
dan__contains__
. Lihat dokumentasi Python 1.4 di sini dan di sini .