4-го октября 2021-го года вышла новая версия ЯП Python. Пройдёмся по основным изменениям!
Новый синтаксис для написания объединений типов
Для типов данных была перегружена операция битового или – |. Теперь для указания
типов переменных стоит использовать не typing.Union[A, B], а A | B. Так, например,
если тип принимаемого функцией значения должен быть строкой или массивом строк, вместо
from typing import Union
def required_permission(perm: Union[str, list[str]]):
pass
пишем
def required_permission(perm: str|list[str]):
pass
Аналогично можно делать проверку isinstance. Вместо
a = 5
if isinstance(a, int) or isinstance(a, str):
pass
пишем
a = 5
if isinstance(a, int|str):
pass
Для указания типа typing.Optional[int] теперь следует использовать int | None (не NoneType).
Замечу, что лучше поддерживать интерфейсы функций, методов и т.д. более строгими – без всяких
Union и Optional. Но если есть необходимость в этом, новый синтаксис выглядит более читаемым.
Улучшен синтаксис для использования контекстных менеджеров
Я уже писал о данной доработке,
которую внесли в феврале. Вкратце: раньше в конструкции with as нельзя было использовать
круглые скобки для группировки открытия нескольких контекстов. Теперь можно. Иными словами:
with (
CtxManager1() as example1,
CtxManager2() as example2
):
pass
Такой код приводил к синтаксической ошибке. Вместо этого приходилось писать как-то так:
with CtxManager1() as example1, \
CtxManager2() as example2:
pass
При этом во всех остальных конструкциях языка можно (и нужно) писать не с помощью \,
а именно при помощи скобок.
С новым парсером в Python 3.10 появилась возможность писать и в привычном ("скобочном") стиле!
Модуль distutils объявлен устаревшим
distutils использовался для пакетирования Python проектов. Пакеты Python же можно установить
чере pip – менеджер пакетов Python. Так что эта
информация в основном полезна для разработчиков, публикующих свои наработки.
У модуля distutils есть куча проблем с поддержкой документации, да и сам он довольно
запутанный. При этом есть множество других модулей, которые также позволяют пакетировать,
при этом поддерживаются лучше и более чётко описаны.
Логичным решением было отказаться от distutils. Во многих аспектах его заменой является setuptools.
С версии Python 3.12 модуль distutils перестанет поддерживаться.
Конструкция match-case для сопоставления по шаблону
Пожалуй, самым большим новшеством является конструкция match-case, о которой я уже писал в феврале.
Если коротко, то это монстр для операций ветвления – if "на стероидах".
Например, если мы хотим получить от пользователя команду и выполнить по ней какое-то действие, то код будет выглядеть подобным образом:
command = input('Выберете действие: ')
match command.split():
case ["quit"]:
exit(0)
case ["go", direction]:
user.move(direction)
case ["drop", *objects]:
for obj in objects:
user.drop(obj)
case _:
print(f"Неизвестная команда '{command!r}'")
В match имеем некоторый объект, его мы сопоставляем с шаблонами из case-ов. Если подходит –
выполняется блок case. Больше примеров по ссылке.
Также были улучшены средства отладки, определения псевдонимов типов, переработаны внутренности
cpython, добавлены исправления, улучшения и баги.
Не знаю как вы, а я уже на ноуте обновил Python – уж слишком вкусно выглядят обновы!