29.10. __future__ – Определения операторов будущего¶__future__ – Future statement definitions
Исходный код: Lib/__future__.py
__future__ – реальный модуль, и он служит трём целям:
- Чтобы не запутывать существующие инструменты, которые анализируют операторы import и ожидают найти импортируемые модули.
- Чтобы гарантировать, что операторы future, выполняемые в версиях, предшествующих
2.1, по крайней мере вызывают исключения времени выполнения (импорт
__future__завершится ошибкой, так как до версии 2.1 модуля с таким именем не существовало). - Чтобы задокументировать, когда были введены несовместимые изменения, и когда они будут
– или были – сделаны обязательными. Это форма исполняемой документации, которую
можно программно просмотреть, импортировав
__future__и изучив его содержимое.
Каждый оператор в __future__.py имеет вид:
FeatureName = _Feature(OptionalRelease, MandatoryRelease,
CompilerFlag)
где обычно OptionalRelease меньше, чем MandatoryRelease, и оба являются
5-кортежами той же формы, что и sys.version_info:
(PY_MAJOR_VERSION, # 2 в 2.1.0a3; целое число
PY_MINOR_VERSION, # 1; целое число
PY_MICRO_VERSION, # 0; целое число
PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" или "final"; строка
PY_RELEASE_SERIAL # 3; целое число
)
OptionalRelease фиксирует первый релиз, в котором эта возможность была принята.
Если MandatoryRelease ещё не наступил, MandatoryRelease предсказывает релиз, в котором возможность станет частью языка.
В противном случае MandatoryRelease фиксирует, когда возможность стала частью языка; в релизах начиная с этого или позже модулям больше не нужен future-оператор для использования данной возможности, но они могут продолжать использовать такие импорты.
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 внутри генераторов |
См. также
- Future-операторы
- Как компилятор обрабатывает future-импорты.