__future__ — Определения директив будущего
Исходный код: Lib/__future__.py
__future__ — это реальный модуль, выполняющий три задачи:
- Избежать путаницы для существующих инструментов, анализирующих операторы импорта и ожидающих найти импортируемые модули.
- Обеспечить, чтобы директивы будущего в версиях до 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 указывает первую версию, в которой функция была принята.
В случае 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 | TBD 1 | PEP 563: Отложенная оценка аннотаций |
-
1 -
from __future__ import annotationsранее планировалось сделать обязательной в Python 3.10, но Совет Руководства Python дважды принял решение отложить изменение (объявление для Python 3.10; объявление для Python 3.11). Пока окончательного решения нет. См. также PEP 563 и PEP 649.
См. также
- Директивы будущего
-
Как компилятор обрабатывает импорты будущего.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/__future__.html