В Python 3.10 был введён механизм структурного сопоставления с образцом (structural pattern matching), оператор match-case. Исторически в Python сложные условия реализовывались цепочкой if/elif/else, что было неудобно при анализе вложенных структур (например, словарей, вложенных кортежей).
Проблема — сложные вложенные проверки становятся мало читабельными и трудными для сопровождения. Подход на основе match-case позволяет лаконично описывать проверки с распаковкой переменных и guard условиями.
Решение — использовать синтаксис match-case, который позволяет сопоставлять структуру объекта (словари, кортежи, списки) с заданным паттерном и извлекать данные.
Пример кода:
point = (1, 2) match point: case (0, 0): print('Origin') case (0, y): print(f'Y={y}') case (x, 0): print(f'X={x}') case (x, y): print(f'X={x}, Y={y}')
Ключевые особенности:
Можно ли использовать match-case для обычных if-elif-else условий по отдельным значениям?
Да, однако сила match-case именно в структурности. Для простых дискретных условий он сродни switch-case языков типа C.
Можно ли использовать match-case с неизменяемыми объектами (например, str)?
Да, match-case работает с любыми объектами, которые можно сравнить с паттерном, включая строки и числа.
Пример кода:
color = 'red' match color: case 'red': print('Это красный') case 'blue': print('Это синий') case _: print('Неизвестный цвет')
Какая ошибка бывает при сопоставлении объектов с одинаковым именем переменных во внешней области видимости?
Сопоставление с шаблоном присваивает переменные локально внутри case, независимо от внешнего контекста. Это может приводить к путанице, если имя переменной уже используется снаружи.
Используют match-case для большого if-elif-else с простыми константами.
Плюсы:
Минусы:
Обрабатывается поток вложенных JSON-структур из API, для которых разные кейсы требуют разного извлечения данных из разных уровней структуры.
Плюсы:
Минусы: