Рассмотрим следующие два класса:«Объект не является итерируемым» Ошибка ввода «x в y»?
class Foo0(object):
pass
class Foo1(object):
def __contains__(self, _):
return False
Ни один из них является итерацию, как можно наблюдать, пытаясь for i in Foo1(): pass
:
Traceback (most recent call last):
File "stuff.py", line 11, in <module>
for i in Foo1(): pass
TypeError: 'Foo1' object is not iterable
Наоборот, 3 in Foo1()
действует (как Foo1
имеет __contains__
), в то время как 3 in Foo0()
не является:
Traceback (most recent call last):
File "stuff.py", line 9, in <module>
3 in Foo0()
TypeError: argument of type 'Foo0' is not iterable
Я считаю ошибку ошибочной. Дело не в том, что Foo0
не является итерируемым - ведь Foo1
тоже не повторяется, так что это не неотъемлемая причина. Более того, поскольку @niemmi и @tobias_k правильно отмечают ниже, если класс не поддерживает __contains__
, __iter__
используется как резерв, что является прямой причиной этой ошибки. Однако это ухудшает ситуацию, так как пользователь может попытаться решить эту ошибку, реализовав __iter__
, что является очень неэффективным средством реализации __contains__
.
Почему это было выбрано как ошибка?
Спасибо, @niemmi, это тоже мое понимание. Тем не менее, это объясняет *, как это происходит, а не если это намеченное обоснование дизайнеров языка. Хороший ответ. –
Сообщение об ошибке должно, по-видимому, объяснить основную причину, а не как отказ резервного копирования также не удалось. – tripleee