HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 - <p><strong>Разработчики представили новую версию языка программирования Python 3.10 - она будет поддерживаться не менее следующих пяти лет. Мы вместе с преподавателем Хекслета Валентином Хомутнко рассказываем, что нового в версии Python 3.10 и почему ее так долго ждали разработчики.</strong></p>
1 + <p><strong>Разработчики представили новую версию языка программирования Python 3.10 - она будет поддерживаться не менее следующих пяти лет. Мы вместе с преподавателем Хекслета Валентином Хомутенко рассказываем, что нового в версии Python 3.10 и почему ее так долго ждали разработчики.</strong></p>
2 <h2>Содержание</h2>
2 <h2>Содержание</h2>
3 <ul><li><a>Python 3.10</a></li>
3 <ul><li><a>Python 3.10</a></li>
4 <li><a>Pattern matching как главное в новом релизе</a></li>
4 <li><a>Pattern matching как главное в новом релизе</a></li>
5 </ul><h2>Python 3.10</h2>
5 </ul><h2>Python 3.10</h2>
6 <p><strong>-</strong>В модуль typing был добавлен оператор <a>Concatenate</a> вместе с переменной <a>ParamSpec</a>, это позволит передавать дополнительную информацию для статической проверки типов при использовании <a>Callable</a>. Модуль typing теперь также имеет специальные значения <a>TypeGuard</a> для аннотирования функций защиты типов и <a>TypeAlias</a> для явного определения псевдонима типа.</p>
6 <p><strong>-</strong>В модуль typing был добавлен оператор <a>Concatenate</a> вместе с переменной <a>ParamSpec</a>, это позволит передавать дополнительную информацию для статической проверки типов при использовании <a>Callable</a>. Модуль typing теперь также имеет специальные значения <a>TypeGuard</a> для аннотирования функций защиты типов и <a>TypeAlias</a> для явного определения псевдонима типа.</p>
7 <p>Кроме того, в модуль <a>typing</a>также добавлен новый оператор, позволяющий использовать синтаксис "X | Y" для выбора одного из типов (тип X или тип Y).</p>
7 <p>Кроме того, в модуль <a>typing</a>также добавлен новый оператор, позволяющий использовать синтаксис "X | Y" для выбора одного из типов (тип X или тип Y).</p>
8 <p><strong>-</strong>В Python 3.10 появилась возможность использовать круглые скобки в операторе<a>with</a> для разнесения на несколько строк определения коллекции <a>контекстных менеджеров</a>. Тут же можно добавить, что теперь разрешается оставлять запятую после работы с финальным контекстным менеджером в группе:</p>
8 <p><strong>-</strong>В Python 3.10 появилась возможность использовать круглые скобки в операторе<a>with</a> для разнесения на несколько строк определения коллекции <a>контекстных менеджеров</a>. Тут же можно добавить, что теперь разрешается оставлять запятую после работы с финальным контекстным менеджером в группе:</p>
9 <p><strong>-</strong>Достаточно сильно улучшена история с информированием разработчика об ошибках в коде. Например, теперь при незакрытой фигурной скобки вместо обычной ошибки синтаксиса будет выводиться подсветка открывающей скобки и указание, что не получается найти закрывающую скобку.</p>
9 <p><strong>-</strong>Достаточно сильно улучшена история с информированием разработчика об ошибках в коде. Например, теперь при незакрытой фигурной скобки вместо обычной ошибки синтаксиса будет выводиться подсветка открывающей скобки и указание, что не получается найти закрывающую скобку.</p>
10 <p>Тут же можно отметить, что для отладочных инструментов теперь событие будет указываться точно вплоть до строк выполненного кода.</p>
10 <p>Тут же можно отметить, что для отладочных инструментов теперь событие будет указываться точно вплоть до строк выполненного кода.</p>
11 <p><strong>-</strong>Функция zip() теперь имеет необязательный флаг "strict", при указании которого проводится проверка на одинаковую длину перебираемых аргументов.</p>
11 <p><strong>-</strong>Функция zip() теперь имеет необязательный флаг "strict", при указании которого проводится проверка на одинаковую длину перебираемых аргументов.</p>
12 <p>Среди других обновлений в функциях - появились встроенные функции <a>aiter()</a> и <a>anext()</a> с реализацией асинхронных аналогов функциям iter() и next(). Кроме того, работа конструкторов str(), bytes() и bytearray() была увеличена на 40% при работе с мелкими объектами.</p>
12 <p>Среди других обновлений в функциях - появились встроенные функции <a>aiter()</a> и <a>anext()</a> с реализацией асинхронных аналогов функциям iter() и next(). Кроме того, работа конструкторов str(), bytes() и bytearray() была увеличена на 40% при работе с мелкими объектами.</p>
13 <h2>Pattern matching как главное в новом релизе</h2>
13 <h2>Pattern matching как главное в новом релизе</h2>
14 <p>По словам преподавателя Хекслета Валентина Хомутенко,<strong>главное обновление этого релиза - функция pattern matching</strong>. Вы могли где-то слышать, что "в Python теперь есть switch case", но это не совсем так. Pattern matching - намного круче, чем обычный switch в других языках.</p>
14 <p>По словам преподавателя Хекслета Валентина Хомутенко,<strong>главное обновление этого релиза - функция pattern matching</strong>. Вы могли где-то слышать, что "в Python теперь есть switch case", но это не совсем так. Pattern matching - намного круче, чем обычный switch в других языках.</p>
15 <p>Предположим, что нам нужно написать функцию, которая читает содержимое текстовых файлов. При этом если файл имеет расширение .md, то она должна попробовать прочитать его как markdown-документ. Если расширение .docx, то как документ Microsoft Office. Во всех остальных случаях надо прочитать его как обычный текстовый файл.</p>
15 <p>Предположим, что нам нужно написать функцию, которая читает содержимое текстовых файлов. При этом если файл имеет расширение .md, то она должна попробовать прочитать его как markdown-документ. Если расширение .docx, то как документ Microsoft Office. Во всех остальных случаях надо прочитать его как обычный текстовый файл.</p>
16 <p>Такую логику можно реализовать помощью обычного if.</p>
16 <p>Такую логику можно реализовать помощью обычного if.</p>
17 <p>А вот как такая же задача решается с помощью pattern matching.</p>
17 <p>А вот как такая же задача решается с помощью pattern matching.</p>
18 <p>Окей, стало чуть компактнее, но кажется не критично.</p>
18 <p>Окей, стало чуть компактнее, но кажется не критично.</p>
19 <p>После этого мы поняли, что пользователи часто передают пути к картинкам и другим бинарным файлам, которые нельзя прочитать как обычный текст. Давайте модифицируем функцию так, чтобы как обычный текст читались только файлы с расширениями .txt или .log.</p>
19 <p>После этого мы поняли, что пользователи часто передают пути к картинкам и другим бинарным файлам, которые нельзя прочитать как обычный текст. Давайте модифицируем функцию так, чтобы как обычный текст читались только файлы с расширениями .txt или .log.</p>
20 <p>И вариант с pattern matching:</p>
20 <p>И вариант с pattern matching:</p>
21 <p>Обратите внимание, что мы обработали сразу два варианта .txt и .log в одной ветке case, используя оператор |. Уже выглядит получше, особенно если сравнить с обычными if.</p>
21 <p>Обратите внимание, что мы обработали сразу два варианта .txt и .log в одной ветке case, используя оператор |. Уже выглядит получше, особенно если сравнить с обычными if.</p>
22 <p>Помимо проверки на конкретное значение, теперь мы можем совершать и более сложные штуки. Например, мы разрабатываем утилиту для работы с файлами. Нам нужно обработать одну из команд пользователя: "скопировать файл" или "удалить файл". Команда копирования выглядит как copy old_path new_path, а удаления - delete path.</p>
22 <p>Помимо проверки на конкретное значение, теперь мы можем совершать и более сложные штуки. Например, мы разрабатываем утилиту для работы с файлами. Нам нужно обработать одну из команд пользователя: "скопировать файл" или "удалить файл". Команда копирования выглядит как copy old_path new_path, а удаления - delete path.</p>
23 <p>Код с обычными if выглядит уже не очень лаконично.</p>
23 <p>Код с обычными if выглядит уже не очень лаконично.</p>
24 <p>А вот так выглядит решение с pattern matching:</p>
24 <p>А вот так выглядит решение с pattern matching:</p>
25 <p>Pattern matching позволяет здесь проверять сразу 2 вещи: количество элементов списка и конкретное значение первого элемента. И все это в рамках одной ветки case без лишних вложенностей или соединения условий через or / and .</p>
25 <p>Pattern matching позволяет здесь проверять сразу 2 вещи: количество элементов списка и конкретное значение первого элемента. И все это в рамках одной ветки case без лишних вложенностей или соединения условий через or / and .</p>
26 <p>Кроме списков, мы можем так просто работать и со словарями. Пусть команда из предыдущего примера теперь передается не строкой, а словарём. Команда копирования будет выглядеть так:</p>
26 <p>Кроме списков, мы можем так просто работать и со словарями. Пусть команда из предыдущего примера теперь передается не строкой, а словарём. Команда копирования будет выглядеть так:</p>
27 <p>{ "action": "copy", "args": ["/old/path", "new_path"], }</p>
27 <p>{ "action": "copy", "args": ["/old/path", "new_path"], }</p>
28 <p>А команда удаление так:</p>
28 <p>А команда удаление так:</p>
29 <p>{ "action": "delete", "args": ["/old/path"], }</p>
29 <p>{ "action": "delete", "args": ["/old/path"], }</p>
30 <p>Код обработки команды не стал сильно сложнее, если мы используем pattern matching.</p>
30 <p>Код обработки команды не стал сильно сложнее, если мы используем pattern matching.</p>
31 <p>И опять же pattern matching позволяет нам сделать сразу много проверок в одном выражении:</p>
31 <p>И опять же pattern matching позволяет нам сделать сразу много проверок в одном выражении:</p>
32 <ul><li>Существование ключа action</li>
32 <ul><li>Существование ключа action</li>
33 <li>Значение ключа action - copy или delete</li>
33 <li>Значение ключа action - copy или delete</li>
34 <li>Существование ключа args</li>
34 <li>Существование ключа args</li>
35 <li>Тип значения у ключа args - значение должно быть массивом.</li>
35 <li>Тип значения у ключа args - значение должно быть массивом.</li>
36 <li>Количество элементов внутри args.</li>
36 <li>Количество элементов внутри args.</li>
37 </ul><p>И все это в одном выражении case :tada:. Если вы хотите подробнее разобраться в этом и прочувствовать всю магию этой функции, то попробуйте в качестве упражнения переписать этот пример без использования pattern matching.</p>
37 </ul><p>И все это в одном выражении case :tada:. Если вы хотите подробнее разобраться в этом и прочувствовать всю магию этой функции, то попробуйте в качестве упражнения переписать этот пример без использования pattern matching.</p>
38 <p>Больше примеров использования можно увидеть в<a>PEP636</a>, а в<a>PEP634</a>можно посмотреть все детали нового синтаксиса.</p>
38 <p>Больше примеров использования можно увидеть в<a>PEP636</a>, а в<a>PEP634</a>можно посмотреть все детали нового синтаксиса.</p>