Вышла новая версия языка программирования Python 3.10. Что в ней важного?

Разработчики представили новую версию языка программирования 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% при работе с мелкими объектами.
Читайте также:
Современный PHP сформирует хорошее мышление в стиле ООП: интервью с Максимом Шамаевым
Pattern matching как главное в новом релизе
По словам преподавателя Хекслета Валентина Хомутенко, главное обновление этого релиза — функция pattern matching. Вы могли где-то слышать, что «в Python теперь есть switch case», но это не совсем так. Pattern matching — намного круче, чем обычный switch в других языках.
Предположим, что нам нужно написать функцию, которая читает содержимое текстовых файлов. При этом если файл имеет расширение .md
, то она должна попробовать прочитать его как markdown-документ. Если расширение .docx
, то как документ Microsoft Office. Во всех остальных случаях надо прочитать его как обычный текстовый файл.
Такую логику можно реализовать помощью обычного if
.
А вот как такая же задача решается с помощью pattern matching.
Окей, стало чуть компактнее, но кажется не критично.
Также полезно:
С чего начать изучение Python и как написать на нем первый код
После этого мы поняли, что пользователи часто передают пути к картинкам и другим бинарным файлам, которые нельзя прочитать как обычный текст. Давайте модифицируем функцию так, чтобы как обычный текст читались только файлы с расширениями .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 можно посмотреть все детали нового синтаксиса.
Никогда не останавливайтесь:
В программировании говорят, что нужно постоянно учиться даже для того, чтобы просто находиться на месте. Развивайтесь с нами — на Хекслете есть сотни курсов по разработке на разных языках и технологиях
Svet Ivanov
4 года назад