__future__ — Определения будущих инструкций

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


__future__ является реальным модулем и служит трем целям:

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

Каждая инструкция в __future__.py имеет форму:

FeatureName = _Feature(OptionalRelease, MandatoryRelease,
                       CompilerFlag)

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

(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
 PY_MINOR_VERSION, # the 1; an int
 PY_MICRO_VERSION, # the 0; an int
 PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
 PY_RELEASE_SERIAL # the 3; an int
)

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

В случае MandatoryRelease, который еще не произошел, MandatoryRelease предсказывает выпуск, в котором особенность станет частью языка.

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

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 обработка внутри генераторов
annotations 3.7.0b1 4.0 PEP 563: Отложенная оценка аннотаций

См.также

Инструкции футуры
Как компилятор относится к будущим импортам.