На этом шаге мы рассмотрим модернизацию кода, чтобы он работал в 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 в новом стиле. Это изменение не имеет никакого отношения к итераторам, что совершенно понятно, но, тем не менее, является хорошей практикой.
На следующем шаге мы подитожим изученный материал.