Комментарии 7
Возвращать self на iter нашего итератора это очень плохая идея, так как если клиентский код захочет делать tee (или просто копировать итератор), то это может привести очень неприятным сайд-еффектам.
А какие есть альтернативы? Совсем без iter оставлять?
В Java это конструкторы копирования. В Python - фабричные методы класса, которые будут создавать новый инстанс с копией нужных данных.
Без iter уже не итератор
https://docs.python.org/3/library/collections.abc.html#collections.abc.Iterator
deepcopy.deepcopy(self)?
Это не очень плохая идея, это стандартное поведение итераторов ("Протокол итераторов") в питоне. Итератор должен возвращать self
в методе __iter__
, это нужно для того, чтобы итераторы можно было использовать в циклах или функциях, ожидающих итерируемый объект.
iterator.__iter__
()Return the iterator object itself. This is required to allow both containers and iterators to be used with the
for
andin
statements.
https://docs.python.org/3/library/stdtypes.html#typeiter
P.S. А если клиентский код захочет делать tee, для этого есть модуль itertools
и функция itertools.tee()
как раз для этой задачи.
Итераторы в Python для самых маленьких