Майбутні заяви

Оновлено: 24.04.2023

future statement — це вказівка компілятору про те, що певний модуль має бути скомпільовано з використанням синтаксису чи семантики, які будуть доступні у визначеному майбутньому випуску Python, де ця функція стане стандартною.

Заява майбутнього призначена для полегшення переходу на майбутні версії Python, які вносять несумісні зміни в мову. Це дозволяє використовувати нові функції окремо для кожного модуля до випуску, у якому ця функція стане стандартною.

future_stmt ::=  "from" "__future__" "import" feature ["as" identifier]
                 ("," feature ["as" identifier])*
                 | "from" "__future__" "import" "(" feature ["as" identifier]
                 ("," feature ["as" identifier])* [","] ")"
feature     ::=  identifier

У верхній частині модуля має бути майбутня заява. Єдині рядки, які можуть відображатися перед майбутнім оператором:

рядок документації модуля (якщо є), коментарі, порожні рядки та інші майбутні заяви.

Єдина функція, яка вимагає використання оператора future, це анотації (див. PEP 563).

Python 3 усе ще розпізнає всі історичні функції, увімкнені оператором future. Список включає absolute_import, division, generators, generator_stop, unicode_literals, print_function, nested_scopes і with_statement. Усі вони зайві, оскільки завжди ввімкнені та зберігаються лише для зворотної сумісності.

Майбутній оператор розпізнається та обробляється спеціально під час компіляції: зміни в семантиці основних конструкцій часто впроваджуються шляхом генерації іншого коду. Може навіть статися так, що нова функція вводить новий несумісний синтаксис (наприклад, нове зарезервоване слово), і в цьому випадку компілятору може знадобитися розібрати модуль по-іншому. Такі рішення не можуть бути відкладені до часу виконання.

Для будь-якого конкретного випуску компілятор знає, які назви функцій були визначені, і викликає помилку під час компіляції, якщо майбутній оператор містить функцію, яка йому невідома.

Пряма семантика часу виконання така ж, як і для будь-якого оператора імпорту: є стандартний модуль __future__, описаний пізніше, і його буде імпортовано звичайним способом під час виконання оператора майбутнього.

Цікава семантика часу виконання залежить від конкретної функції, увімкненої майбутнім оператором.

Зауважте, що в заяві немає нічого особливого:

import __future__ [as name]

Це не заява про майбутнє; це звичайний оператор імпорту без спеціальних семантичних або синтаксичних обмежень.

Код, скомпільований за допомогою викликів вбудованих функцій exec() і compile(), які виникають у модулі M, що містить майбутній оператор, за замовчуванням використовуватиме новий пов’язаний синтаксис або семантику з майбутньою заявою. Цим можна керувати необов’язковими аргументами compile() — подробиці дивіться в документації цієї функції.

Майбутній оператор, набраний у підказці інтерактивного перекладача, матиме чинність до кінця сеансу перекладача. Якщо інтерпретатор запускається з параметром -i, йому передається ім’я сценарію для виконання, і сценарій містить майбутній оператор, він діятиме в інтерактивному сеансі, розпочатому після виконання сценарію.