__future__ — Будущие определения утверждений

Источник: Lib/__future__.py


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

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

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

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

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

Содержание модуля

Ни одно описание функции никогда не будет удалено из __future__. С момента появления этого механизма в Python 2.1 в язык попали следующие функции:

особенность

необязательный в

обязательный в

эффект

вложенные_области

2.1.0b1

2.2

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

генераторы

2.2.0a1

2.3

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

подразделение

2.2.0a2

3.0

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

абсолютный_импорт

2.5.0a1

3.0

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

с_высказыванием

2.5.0a1

2.6

PEP 343: Утверждение «с »

функция_печати

2.6.0a2

3.0

PEP 3105: Сделать печать функцией.

unicode_literals

2.6.0a2

3.0

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

остановка генератора

3.5.0b1

3.7

PEP 479: Обработка стоп-итераций внутри генераторов

аннотации

3.7.0b1

TBD [1]

PEP 563: Отложена оценка аннотаций

class __future__._Feature

Каждое утверждение в __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
)
_Feature.getOptionalRelease()

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

_Feature.getMandatoryRelease()

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

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

MandatoryRelease может также иметь значение None, означающее, что запланированная функция была отменена или что решение по ней еще не принято.

_Feature.compiler_flag

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

См.также

Будущие заявления

Как компилятор относится к будущему импорту.

PEP 236 - Назад в __будущее_

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