Требуется ли формально итераторам Python метод __iter__? - PullRequest
4 голосов
/ 08 мая 2020

В нескольких местах в Интернете, включая ответы в Stack Overflow (например, this , this & this ), укажите, что итераторы Python должны реализовывать как __next__ метод (который я понимаю) и метод __iter__. Эти места справедливо заключают, что все итераторы также являются повторяемыми. Даже PyCharm выдает предупреждение типа, если переменная, помеченная как typing.Iterator, не реализует этот метод __iter__.

В отличие от них, официальный Python раздел руководства по итераторам только упоминает необходимость в методе __next__:

Функция возвращает объект-итератор, который определяет метод __next__(), который обращается к элементам в контейнере по одному

Итак, мой вопрос: должны ли Python итераторы формально быть итерируемыми сами по себе? Я лично не понимаю, почему это должно быть правдой и почему мы не можем полностью разделить требования для Iterable и Iterator.

1 Ответ

4 голосов
/ 08 мая 2020

Это учебник. Он замалчивает вещи. Если вы посмотрите документацию по модели данных , вы увидите явное требование, что итераторы поддерживают __iter__:

Сами объекты итератора должны поддерживать следующие два метода: которые вместе образуют протокол итератора :

iterator.__iter__()

Возвращает сам объект итератора. Это необходимо, чтобы разрешить использование контейнеров и итераторов с операторами for и in. Этот метод соответствует слоту tp_iter структуры типов для Python объектов в Python / C API.

iterator.__next__()

...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...