При обертывании (внутреннего) итератора часто необходимо перенаправить метод __iter__
в базовый итерируемый. Рассмотрим следующий пример:"yield from iterable" vs "return iter (iterable)"
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()
- это образец, который я использовал до сих пор.
Предполагая, что цель состоит в том, чтобы просто передать/разоблачить основной Iterable, т.е. без изменения/инъекции других предметов, я не думаю, что я буду придерживаться 'ИТЭР()', потому что: 1) если I не добавляйте никакого дополнительного поведения, мне не нужно, чтобы он появлялся в трассировке исключения (я думаю?). 2), чтобы избежать использования глобального 'iter()' я мог бы вызвать 'return internal_iterable .__ iter __()'. Что касается третьего поднятого вами вопроса, мне придется подумать о том, что это значит. – PeterE