Pull to refresh

Comments 7

Возвращать self на iter нашего итератора это очень плохая идея, так как если клиентский код захочет делать tee (или просто копировать итератор), то это может привести очень неприятным сайд-еффектам.

А какие есть альтернативы? Совсем без iter оставлять?

В Java это конструкторы копирования. В Python - фабричные методы класса, которые будут создавать новый инстанс с копией нужных данных.

Это не очень плохая идея, это стандартное поведение итераторов ("Протокол итераторов") в питоне. Итератор должен возвращать self в методе __iter__, это нужно для того, чтобы итераторы можно было использовать в циклах или функциях, ожидающих итерируемый объект.

iterator.__iter__()

Return the iterator object itself. This is required to allow both containers and iterators to be used with the for and in statements.

https://docs.python.org/3/library/stdtypes.html#typeiter

P.S. А если клиентский код захочет делать tee, для этого есть модуль itertools и функция itertools.tee() как раз для этой задачи.

Да, перепроверил, был не прав. Почему-то я был в полной уверенности, что даже iter(iter(list)) даст новый независимый итератор. Оказалось и правда self. И даже по исходникам cpython он тоже возвращает тоже себя.

Sign up to leave a comment.