Вышла новая версия языка программирования Python 3.10. Что в ней важного?
2026-02-26 18:06 Diff

Разработчики представили новую версию языка программирования Python 3.10 — она будет поддерживаться не менее следующих пяти лет. Мы вместе с преподавателем Хекслета Валентином Хомутенко рассказываем, что нового в версии Python 3.10 и почему ее так долго ждали разработчики.

Содержание

Python 3.10

В модуль typing был добавлен оператор Concatenate вместе с переменной ParamSpec, это позволит передавать дополнительную информацию для статической проверки типов при использовании Callable. Модуль typing теперь также имеет специальные значения TypeGuard для аннотирования функций защиты типов и TypeAlias для явного определения псевдонима типа.

Кроме того, в модуль typing также добавлен новый оператор, позволяющий использовать синтаксис "X | Y" для выбора одного из типов (тип X или тип Y).

В Python 3.10 появилась возможность использовать круглые скобки в операторе with для разнесения на несколько строк определения коллекции контекстных менеджеров. Тут же можно добавить, что теперь разрешается оставлять запятую после работы с финальным контекстным менеджером в группе:

Достаточно сильно улучшена история с информированием разработчика об ошибках в коде. Например, теперь при незакрытой фигурной скобки вместо обычной ошибки синтаксиса будет выводиться подсветка открывающей скобки и указание, что не получается найти закрывающую скобку.

Тут же можно отметить, что для отладочных инструментов теперь событие будет указываться точно вплоть до строк выполненного кода.

Функция zip() теперь имеет необязательный флаг "strict", при указании которого проводится проверка на одинаковую длину перебираемых аргументов.

Среди других обновлений в функциях — появились встроенные функции aiter() и anext() с реализацией асинхронных аналогов функциям iter() и next(). Кроме того, работа конструкторов str(), bytes() и bytearray() была увеличена на 40% при работе с мелкими объектами.

Pattern matching как главное в новом релизе

По словам преподавателя Хекслета Валентина Хомутенко, главное обновление этого релиза — функция pattern matching. Вы могли где-то слышать, что «в Python теперь есть switch case», но это не совсем так. Pattern matching — намного круче, чем обычный switch в других языках.

Предположим, что нам нужно написать функцию, которая читает содержимое текстовых файлов. При этом если файл имеет расширение .md, то она должна попробовать прочитать его как markdown-документ. Если расширение .docx, то как документ Microsoft Office. Во всех остальных случаях надо прочитать его как обычный текстовый файл.

Такую логику можно реализовать помощью обычного if.

А вот как такая же задача решается с помощью pattern matching.

Окей, стало чуть компактнее, но кажется не критично.

После этого мы поняли, что пользователи часто передают пути к картинкам и другим бинарным файлам, которые нельзя прочитать как обычный текст. Давайте модифицируем функцию так, чтобы как обычный текст читались только файлы с расширениями .txt или .log.

И вариант с pattern matching:

Обратите внимание, что мы обработали сразу два варианта .txt и .log в одной ветке case, используя оператор |. Уже выглядит получше, особенно если сравнить с обычными if.

Помимо проверки на конкретное значение, теперь мы можем совершать и более сложные штуки. Например, мы разрабатываем утилиту для работы с файлами. Нам нужно обработать одну из команд пользователя: «скопировать файл» или «удалить файл». Команда копирования выглядит как copy old_path new_path, а удаления — delete path.

Код с обычными if выглядит уже не очень лаконично.

А вот так выглядит решение с pattern matching:

Pattern matching позволяет здесь проверять сразу 2 вещи: количество элементов списка и конкретное значение первого элемента. И все это в рамках одной ветки case без лишних вложенностей или соединения условий через or / and .

Кроме списков, мы можем так просто работать и со словарями. Пусть команда из предыдущего примера теперь передается не строкой, а словарём. Команда копирования будет выглядеть так:

{ "action": "copy", "args": ["/old/path", "new_path"], }

А команда удаление так:

{ "action": "delete", "args": ["/old/path"], }

Код обработки команды не стал сильно сложнее, если мы используем pattern matching.

И опять же pattern matching позволяет нам сделать сразу много проверок в одном выражении:

  • Существование ключа action
  • Значение ключа action — copy или delete
  • Существование ключа args
  • Тип значения у ключа args — значение должно быть массивом.
  • Количество элементов внутри args.

И все это в одном выражении case :tada:. Если вы хотите подробнее разобраться в этом и прочувствовать всю магию этой функции, то попробуйте в качестве упражнения переписать этот пример без использования pattern matching.

Больше примеров использования можно увидеть в PEP636, а в PEP634 можно посмотреть все детали нового синтаксиса.