Использовался ли pattern-matching в Python
Что проверяют
Вопрос про опыт, но за ним проверка, знаете ли вы match глубже примера со сравнением строк: какие бывают шаблоны и где конструкция ведёт себя неожиданно. Следом просят написать разбор словаря или объяснить, почему case RED: ловит всё подряд.
Как отвечать
Начните с факта: структурное сопоставление с образцом появилось в Python 3.10 (PEP 634). match и case при этом мягкие ключевые слова, переменная match в старом коде не ломается. Затем покажите, что знаете виды шаблонов:
- литералы и
|:case 200 | 201:, а_это шаблон «всё остальное»; - последовательности:
case ["go", direction]:илиcase [first, *rest]:. Строки иbytesсюда намеренно не подходят,"ab"не совпадёт с[a, b]; - словари:
case {"type": "circle", "radius": r}:совпадает, если эти ключи есть, лишние игнорируются, остаток собирают через**rest; - классы:
case Point(x=0, y=y):. Позиционная формаPoint(0, y)работает через__match_args__, уdataclassон генерируется автоматически; - гарды и
as:case {"age": int(age)} if age >= 18:,case [Point() as p, *_]:.
Потом расскажите, где применяли, своими примерами: разбор событий из очереди по полю type, ответы внешнего API разной формы, команды CLI, обход дерева ast. Хорошо, если скажете и где не стали использовать: для выбора по одному ключу проще словарь функций.
Если не использовали, объясните причину честно: проект сидел на 3.8 или 3.9, где синтаксиса нет. Обе версии уже сняты с поддержки, так что покажите, что синтаксис знаете, на коротком примере.
Где спотыкаются
Пишут голое имя в надежде сравнить с константой: case RED:. Это захват в переменную, который совпадает с чем угодно, и если такой case не последний, интерпретатор выдаст SyntaxError. Константу пишут через точку: Color.RED.
Забывают case _ и считают, что несовпадение вызовет ошибку. Конструкция молча ничего не делает. Полноту веток по Enum или объединению типов проверяют mypy или pyright вместе с assert_never.
Думают, что match работает как switch с таблицей переходов и быстрее цепочки if. Ветки проверяются по очереди сверху вниз, выигрыш в читаемости, а не в скорости.