Nếu một đối tượng không có __contains__triển khai, hãy inquay lại mặc định về cơ bản hoạt động như thế này:
def default__contains__(self, element):
for thing in self:
if thing == element:
return True
return False
Và nếu một đối tượng không có __iter__triển khai, hãy forquay lại mặc định về cơ bản hoạt động như thế này:
def default__iter__(self):
i = 0
try:
while True:
yield self[i]
i += 1
except IndexError:
pass
Các giá trị mặc định này được sử dụng ngay cả khi đối tượng không có ý định là một chuỗi.
Của bạn 1 in fvà 5 in fcác bài kiểm tra đang sử dụng các dự phòng mặc định cho invà for, dẫn đến hành vi được quan sát. 1 in ftìm thấy 1ngay lập tức, nhưng bạn __getitem__không bao giờ trở lại 5, vì vậy 5 in fchạy mãi mãi.
(Vâng, trên thực tế, tình hình thực hiện tham chiếu của Python, mặc định __iter__cửa hàng dự phòng các chỉ số trong một biến C cấp các loại Py_ssize_t, vì vậy nếu bạn chờ đợi đủ lâu, rằng biến đạt cực đại và Python đặt ra một OverflowError . Nếu bạn thấy rằng, bạn phải có trên bản dựng Python 32 bit. Máy tính chưa tồn tại đủ lâu để bất kỳ ai có thể đánh nó trên Python 64 bit.)