При обертывании (внутреннего) итератора часто необходимо перенаправить метод __iter__
в исходный итеративный. Рассмотрим следующий пример:
class FancyNewClass(collections.Iterable):
def __init__(self):
self._internal_iterable = [1,2,3,4,5]
# ...
# variant A
def __iter__(self):
return iter(self._internal_iterable)
# variant B
def __iter__(self):
yield from self._internal_iterable
Есть ли существенная разница между вариантами A и B?
Вариант A возвращает объект итератора, который был запрошен через iter()
из внутреннего итерабельного. Вариант B возвращает объект-генератор, который возвращает значения из внутреннего итерабельного. По какой-то причине это выгодно? В collections.abc
используется версия yield from
. Вариант return iter()
- это шаблон, который я использовал до сих пор.