__future__
— Определения будущих заявлений¶
Исходный код: Lib/__future__.py
Импорт формы from __future__ import feature
вызывается future statements. Компилятор Python использует специальный регистр, чтобы разрешить использование новых функций Python в модулях, содержащих инструкцию future, до выпуска, в котором эта функция станет стандартной.
Хотя компилятор Python придает этим операторам future дополнительное специальное значение, они по-прежнему выполняются как и любой другой оператор import, и __future__
существует и обрабатывается системой импорта так же, как и любой другой модуль Python. Этот дизайн служит трем целям:
Чтобы избежать путаницы в существующих инструментах, которые анализируют инструкции по импорту и ожидают найти импортируемые модули.
Для документирования того, когда были внесены несовместимые изменения и когда они станут обязательными. Это форма исполняемой документации, которую можно проверить программным путем, импортировав
__future__
и изучив ее содержимое.Чтобы гарантировать, что future statements запускается в версиях, предшествующих версии Python 2.1, по крайней мере, приводит к исключениям во время выполнения (импорт
__future__
завершится ошибкой, поскольку до версии 2.1 не было модуля с таким именем).
Содержимое модуля¶
Ни одно описание функциональности никогда не будет удалено из __future__
. С момента его появления в Python 2.1 с помощью этого механизма в языке появились следующие функции:
особенность |
необязательный в |
обязательный в |
эффект |
---|---|---|---|
вложенные области |
2.1.0в1 |
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: Оператор «with» |
функция печати |
2.6.0a2 |
3.0 |
PEP 3105: Сделать печать функцией |
unicode_literals - буквенный код |
2.6.0a2 |
3.0 |
PEP 3112: Байтовые литералы в Python 3000 |
остановка генератора |
3.5.0в1 |
3.7 |
PEP 479: Обработка остановки внутри генераторов |
аннотации |
3.7.0в1 |
ТБД [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()¶
В случае обязательного выпуска, который еще не состоялся, MandatoryRelease предсказывает выпуск, в котором функция станет частью языка.
Else MandatoryRelease записывает, когда функция стала частью языка; в релизах, выпущенных в это время или после этого, модулям больше не требуется инструкция future для использования рассматриваемой функции, но они могут продолжать использовать такой импорт.
MandatoryRelease также может быть
None
, что означает, что запланированная функция была удалена или что решение по ней еще не принято.
- _Feature.compiler_flag¶
CompilerFlag - это флаг (битовое поле), который должен быть передан в четвертом аргументе встроенной функции
compile()
, чтобы включить функцию в динамически компилируемом коде. Этот флаг хранится в атрибуте_Feature.compiler_flag
в экземплярах_Feature
.
См.также
- Будущие заявления
Как компилятор обрабатывает будущий импорт.
- PEP 236 - Назад в __будущее__
Первоначальное предложение по __будущему__ механизму.