Документация Python неофициальный перевод

29.10. __future__ – Определения операторов будущего__future__ – Future statement definitions

Исходный код: Lib/__future__.py


__future__ – реальный модуль, и он служит трём целям:

  • Чтобы не запутывать существующие инструменты, которые анализируют операторы import и ожидают найти импортируемые модули.
  • Чтобы гарантировать, что операторы future, выполняемые в версиях, предшествующих 2.1, по крайней мере вызывают исключения времени выполнения (импорт __future__ завершится ошибкой, так как до версии 2.1 модуля с таким именем не существовало).
  • Чтобы задокументировать, когда были введены несовместимые изменения, и когда они будут – или были – сделаны обязательными. Это форма исполняемой документации, которую можно программно просмотреть, импортировав __future__ и изучив его содержимое.

Каждый оператор в __future__.py имеет вид:

FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)

где обычно OptionalRelease меньше, чем MandatoryRelease, и оба являются 5-кортежами той же формы, что и sys.version_info:

(PY_MAJOR_VERSION, # 2 в 2.1.0a3; целое число
 PY_MINOR_VERSION, # 1; целое число
 PY_MICRO_VERSION, # 0; целое число
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" или "final"; строка
 PY_RELEASE_SERIAL # 3; целое число
)

OptionalRelease фиксирует первый релиз, в котором эта возможность была принята.

Если MandatoryRelease ещё не наступил, MandatoryRelease предсказывает релиз, в котором возможность станет частью языка.

В противном случае MandatoryRelease фиксирует, когда возможность стала частью языка; в релизах начиная с этого или позже модулям больше не нужен future-оператор для использования данной возможности, но они могут продолжать использовать такие импорты.

MandatoryRelease также может быть None, что означает, что запланированная возможность была отменена.

Экземпляры класса _Feature имеют два соответствующих метода, getOptionalRelease() и getMandatoryRelease().

CompilerFlag – это (битовый) флаг, который следует передавать четвёртым аргументом во встроенную функцию compile(), чтобы включить возможность в динамически компилируемом коде. Этот флаг хранится в атрибуте compiler_flag экземпляров _Feature.

Ни одно описание возможности никогда не будет удалено из __future__. Начиная с его появления в Python 2.1, следующие возможности вошли в язык с помощью этого механизма:

Возможность Необязательно в Обязательно в Эффект
nested_scopes 2.1.0b1 2.2 PEP 227: Статически вложенные области видимости
generators 2.2.0a1 2.3 PEP 255: Простые генераторы
division 2.2.0a2 3.0 PEP 238: Изменение оператора деления
absolute_import 2.5.0a1 3.0 PEP 328: Импорты: многострочные и абсолютные/относительные
with_statement 2.5.0a1 2.6 PEP 343: Оператор with
print_function 2.6.0a2 3.0 PEP 3105: Сделать print функцией
unicode_literals 2.6.0a2 3.0 PEP 3112: Байтовые литералы в Python 3000
generator_stop 3.5.0b1 3.7 PEP 479: Обработка StopIteration внутри генераторов

См. также

Future-операторы
Как компилятор обрабатывает future-импорты.