Майбутні заяви
Оновлено: 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, йому передається ім’я сценарію для виконання, і сценарій містить майбутній оператор, він діятиме в інтерактивному сеансі, розпочатому після виконання сценарію.