Наиболее интересные новшества:
- Присваивающее выражение:
Новый оператор
:=
позволяет присваивать значения переменным внутри выражений. Например:if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
- Positional-only аргументы:
Теперь можно указать, какие параметры функций можно передавать через синтаксис именованных аргументов, а какие нет. Пример:
Это изменение дает разработчикам способ обезопасить пользователей своих API от изменений в названии аргументов функций.def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f) f(10, 20, 30, d=40, e=50, f=60) # OK f(10, b=20, c=30, d=40, e=50, f=60) # ошибка, `b` не может быть именованным аргументом f(10, 20, 30, 40, 50, f=60) # ошибка, `e` обязан быть именованным аргументом
- Поддержка f-строками
=
для самодокументирующих выражений и отладки:Добавлен сахар для упрощения отладочных/логгирующих сообщений.
n = 42 print(f'Hello world {n=}.') # напечатает "Hello world n=42."
- Исправлено ключевое слово
continue
в блокеfinally
(раньше оно не работало).
Прочее:
- Можно явно указать путь к кэшу байткода вместо дефолтного
__pycache__
. - Debug и Release сборки используют один и тот же ABI.
>>> Подробности