__future__ — определения инструкций future
Исходный код: Lib/__future__.py
Импорты вида from __future__ import feature называются инструкциями future. Компилятор Python обрабатывает их особым образом, чтобы разрешить использование новых возможностей Python в модулях, содержащих инструкцию future, до выпуска версии, в которой эта возможность станет стандартной.
Хотя компилятор Python придаёт этим инструкциям future особое значение, они всё равно выполняются как любые другие инструкции импорта, а __future__ существует и обрабатывается системой импорта так же, как любой другой модуль Python. У такого решения три цели:
- Не вводить в заблуждение существующие инструменты, анализирующие инструкции импорта и ожидающие найти импортируемые модули.
- Документировать, когда были введены несовместимые изменения и когда они станут — или стали — обязательными. Это форма исполняемой документации, которую можно исследовать программно, импортировав
__future__и изучив его содержимое. - Обеспечить, чтобы инструкции future в версиях до Python 2.1 как минимум вызывали исключения во время выполнения (импорт
__future__завершится ошибкой, поскольку до версии 2.1 модуля с таким именем не существовало).
Содержимое модуля
Описание возможностей никогда не будет удалено из __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 | пока не определено [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 ещё не наступил, это значение указывает предполагаемый выпуск, в котором возможность станет частью языка.
В противном случае MandatoryRelease указывает, когда возможность стала частью языка; в этом и последующих выпусках модулям больше не требуется инструкция future для использования соответствующей возможности, хотя такие импорты по-прежнему можно использовать.
Значение MandatoryRelease также может быть
None, что означает, что от запланированной возможности отказались или решение по ней ещё не принято.
-
_Feature.compiler_flag -
CompilerFlag — это флаг (битовое поле), который следует передать четвёртым аргументом встроенной функции
compile(), чтобы включить возможность в динамически компилируемом коде. Этот флаг хранится в атрибуте_Feature.compiler_flagэкземпляров_Feature.
См. также
- Инструкции future
-
Как компилятор обрабатывает импорты future.
- PEP 236 — Возвращение к __future__
-
Первоначальное предложение о механизме __future__.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/__future__.html