__future__
— Будущие определения утверждений¶
Исходный код: Lib/__future__.py.
__future__
является настоящим модулем и служит трем целям:
Чтобы не сбивать с толку существующие инструменты, которые анализируют операторы импорта и ожидают найти импортируемые модули.
Для того, чтобы future statements, запущенные под релизами до 2.1, как минимум выдавали исключения во время выполнения (импорт
__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 записывает первый выпуск, в котором функция была принята.
В случае обязательного выпуска, который еще не состоялся, обязательный выпуск предсказывает выпуск, в котором функция станет частью языка.
Else MandatoryRelease фиксирует, когда функция стала частью языка; в выпусках, вышедших после этого или позже, модули больше не нуждаются в будущем утверждении для использования рассматриваемой функции, но могут продолжать использовать такие импорты.
MandatoryRelease также может быть None
, что означает, что запланированная функция была отменена.
Экземпляры класса _Feature
имеют два соответствующих метода, getOptionalRelease()
и getMandatoryRelease()
.
CompilerFlag - это флаг (битовое поле), который следует передать в четвертом аргументе встроенной функции compile()
для включения функции в динамически компилируемый код. Этот флаг хранится в атрибуте compiler_flag
на экземплярах _Feature
.
Ни одно описание функции никогда не будет удалено из __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 |
|
функция печати |
2.6.0a2 |
3.0 |
PEP 3105: Сделать печать функцией |
уникодовые_литералы |
2.6.0a2 |
3.0 |
PEP 3112: Байтовые литералы в Python 3000. |
остановка генератора |
3.5.0b1 |
3.7 |
PEP 479: Обработка StopIteration внутри генераторов |
аннотации |
3.7.0b1 |
TBD 1 |
PEP 563: Отложенная оценка аннотаций. |
- 1
from __future__ import annotations
ранее планировалось сделать обязательным в Python 3.10, но Руководящий совет Python дважды решил отложить это изменение (announcement for Python 3.10; announcement for Python 3.11). Окончательное решение пока не принято. См. также PEP 563 и PEP 649.
См.также
- Заявления о будущем
Как компилятор обрабатывает будущие импорты.