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

__future__ – Определения future-операторов__future__ – Future statement definitions

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


Импорты вида from __future__ import feature называются future statements. Компилятор Python обрабатывает их особым образом, чтобы разрешить использование новых возможностей Python в модулях, содержащих такой future-оператор, ещё до выхода версии, в которой эта возможность становится стандартной.

Хотя компилятор Python придаёт этим future-операторам дополнительный особый смысл, они выполняются как любой другой оператор import, и модуль __future__ существует и обрабатывается системой импорта так же, как любой другой модуль Python. Такое устройство преследует три цели:

  • Чтобы не запутывать существующие инструменты, которые анализируют операторы import и ожидают найти импортируемые модули.

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

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

Содержимое модуляModule Contents

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

Возможность

Необязательно в

Обязательно в

Эффект

__future__.nested_scopes

2.1.0b1

2.2

PEP 227: Статически вложенные области видимости

__future__.generators

2.2.0a1

2.3

PEP 255: Простые генераторы

__future__.division

2.2.0a2

3.0

PEP 238: Изменение оператора деления

__future__.absolute_import

2.5.0a1

3.0

PEP 328: Импорты: многострочные и абсолютные/относительные

__future__.with_statement

2.5.0a1

2.6

PEP 343: Оператор “with”

__future__.print_function

2.6.0a2

3.0

PEP 3105: Превращение print в функцию

__future__.unicode_literals

2.6.0a2

3.0

PEP 3112: Байтовые литералы в Python 3000

__future__.generator_stop

3.5.0b1

3.7

PEP 479: Обработка StopIteration внутри генераторов

__future__.annotations

3.7.0b1

Никогда [1]

PEP 563: Отложенное вычисление аннотаций

class __future__._Feature

Каждый оператор в __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; целое число
)
_Feature.getOptionalRelease()

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

_Feature.getMandatoryRelease()

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

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

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

_Feature.compiler_flag

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

См. также

Future-операторы

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

PEP 236 – Назад в __future__

Оригинальное предложение механизма __future__.