Pattern Matching в Python 3.10: примеры, ограничения, применение

preview_player
Показать описание
Новый Python 3.10 вышел с крутой и мощной фичей - pattern matching, хочу показать как с ней можно работать, какие есть ограничения и в чем она хороша.

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

Правила работы с ПМ:
1) несмотря на возможность - не стоит давать своим объектам имена match и case
2) _ - универсальный символ (wildcard), может быть добавлен в конце для отработки всех остальных вариантов
3) [a,b], (a,b) и a,b равнозначны, ожидается последовательность (кроме строки и байтов), но не set или dict
4) допустим вызов только типов (float(), str(), MyClass() и т.д.), обращения по индексу недопустимы
5) после паттерна может быть добавлен guard начинающийся с if, он сработает только при удачном сравнении шаблона
6) последовательности (sequence) проверяются строго по содержимому и размеру, маппинги (dict) проверяют только конкретные вхождения ключей
7) имена привязываются (bind) локально, они доступны вне контекста match, для использования внешних констант нужно использовать точку
8) применяются правила распаковки
9) для OR случаев должны быть привязаны одинаковые имена
10) AS позволит привязать имя даже внутри паттерна
11) проверять типы можно даже внутри паттерна и при привязке имени

НЕЛЬЗЯ:
1) писать **_ для маппингов (dict)
2) вызывать свои функции или обращаться к какой то коллекции по индексу (a_list[x]) в блоке case
3) привязывать разные имена при использовании OR (|)

Туториал:

Что нового в питоне 3.10:

Присоединяйтесь к помощи каналу, будет интересно)
✔️Юмани 410011506612886

Будь первым везде и всегда, включай уведомления о новых выпусках 🔔

Смотри там где удобно🤩

#Python #PythonRussian #PyCharm
Рекомендации по теме
Комментарии
Автор

Как всегда отличный ролик с отличными примерами. Лучший контент по Python на русском.
Пока переходить на 10-ую версию не собираюсь, но было полезно узнать на будущее о нововведении.

nurmukhanbetrakhimbayev
Автор

Так то ж switch - case плюсовский. Не?
А, не :) ЧТо-то поинтереснее!
Офигенская штука! Жалею, что не полез её сразу изучать, как 3.10 вышел. Щас бы...радовался...
Как раз приходится парсить чужие структуры. Эта вещь здорово подсобит!

mrmedbedb
Автор

я бы еще добавил, что проверять можно и принадлежность к типам классам, когда передаётся его объект. да, говорили, что такая проверка это аналог isinstance, но все равно без примеров с экземплярами классов это не очевидно. и про __match_args__ не сказали.
в гарде уже работает обычный синтаксис. можно вызывать по индексу, нельзя использовать проверку, например set(), можно вызывать функции и так далее. а видео огонь, спасибо за разбор

NoNoNo_Name
Автор

спасибо за урок, классное объяснение, приятная речь. доходчиво, будем использовать - вещь супер

maiorchiks
Автор

Как всегда, Браво)).
Ей-Богу, у тебя талант объяснять.
Главное не бросай это дело, кто хочет, тот услышит, в качестве примера, могу привести себя: 1)правлю свой код, избавляясь от лишнего(иногда - из 5 строк получается 1 более правильная ), 2: Пишу тесты, где не было(а их много где не было, каюсь), код привожу в удобочитаемый вид(ранее -значения не придавал, каюсь)
Вопрос: стоит ли уже переходить на Python 3.10 (не сыроват ли)?
Спасибо.

alexeykolodochkin
Автор

Відео корисне але багато води... На мою думку не варто повторювати по 10 раз одне й те саме. А так відео годне. Дякую!

frez_x
Автор

Добрый день, не подскажите что означает конструкция -> str после определения параметра функции 12:00

KostiantynLysenkov
Автор

Если можно: D теле функции указано - целое от деления (.//), а в выводе (print) просто деление(/). Как и задумывалось. Кого то этот недочет может озадачить

ЕВЯ-ом
Автор

На 30:20 можно ли str() в case понимать, как str('text') is 'text' -> True ? Или просто запомнить, что подобная конструкция - проверка на строку?

Dima
Автор

Можно ли было в примере на 48:13 написать так. case {"meta": val} if len(value) == 1: ?

ironmike
Автор

Есть такой вопрос: у меня такой список [[1, 2], [3, 4]]. количество списков внутри может быть любое, а в них элементы должны быть целыми числами. Как это условие в case записать? Что список со списками - это всё норм проверяет, а, вот, что внутри именно целые числа не могу понять как сделать...

ПавелЦыганов-яс
Автор

Стоит ли переходить на новую версию пайтона? Ставил ещё на релизе и столкнулся с проблемой совместимости огромного числа библиотек. Как сейчас обстоят дела?

eldos
Автор

Возвращать из ф-ции строку в случае ошибки это конечно еще тот кАлхоз.
Для таких вещей есть исключения или None

avazart