Шаг 149.
Python: тонкости программирования.
Циклы и итерации. Красивые итераторы. Совместимость с Python 2.x

    На этом шаге мы рассмотрим модернизацию кода, чтобы он работал в Python 2.x.

    Все примеры кода, которые здесь приводились, были написаны на Python 3. Существует одна небольшая, но важная разница между Python 2 и Python 3 в том, что касается реализации итераторов на основе класса:

    Эта разница в обозначении может привести к небольшой проблеме при попытке писать итераторы на основе класса, которые должны работать в обеих версиях Python. К счастью, существует простой подход, который можно применить, чтобы обойти эту разницу.

    Ниже приведена обновленная версия класса InfiniteRepeater, который будет работать как в Python 2, так и в Python 3:

class InfiniteRepeater(object):
    def __init__(self, value):
        self.value = value
    def __iter__(self):
        return self
    def __next__(self):
        return self.value
    
    # Совместимость с Python 2:
    def next(self):
         return self.__next__()

    Чтобы сделать этот класс-итератор совместимым с Python 2, мы внесли в него два небольших изменения.

    Во-первых, добавили метод next(), который просто вызывает оригинальный метод __next__() и пересылает возвращаемое из него значение. По существу, тем самым создается псевдоним для существующей реализации метода __next__() для того, чтобы его нашел Python 2. Благодаря этому мы можем поддерживать обе версии Python, при этом сохраняя все фактические детали реализации в одном месте.

    И во-вторых, модифицировали определение класса, и теперь он наследует от object, чтобы обеспечить создание класса Python 2 в новом стиле. Это изменение не имеет никакого отношения к итераторам, что совершенно понятно, но, тем не менее, является хорошей практикой.

    На следующем шаге мы подитожим изученный материал.




Предыдущий шаг Содержание Следующий шаг