Сопоставление с образцом (match / case)
См. также: Управляющие конструкции · Типы данных · ООП в Python
Назначение
Начиная с Python 3.10, конструкция match / case (structural pattern matching) позволяет ветвить выполнение не только по булевому условию, но и по форме значения: константа, тип, распаковка последовательности, поля словаря, атрибуты объекта.
Это не замена if для простых проверок, а инструмент для разбора сообщений, статусов API, узлов AST, вариантов ответа дискриминированных типов.
Базовый синтаксис
def http_status(code: int) -> str:
match code:
case 200:
return "OK"
case 404:
return "Not Found"
case 500 | 502 | 503:
return "Server error"
case _:
return "Unknown"
case _— ветка по умолчанию (какelse);case 500 | 502— несколько литералов через|(логическое «или» внутри образца).
match вычисляет одно выражение слева и сравнивает с образцами сверху вниз до первого совпадения.
Сопоставление с типами
def describe(value):
match value:
case int() if value >= 0:
return f"неотрицательное целое {value}"
case int():
return f"отрицательное целое {value}"
case str() if not value:
return "пустая строка"
case str() as text:
return f"строка длины {len(text)}"
case _:
return "другой тип"
Класс в образце (int(), str()) проверяет тип через isinstance. Условие после if называется guard — образец подходит только если guard истинен.
Последовательности и распаковка
def head_tail(items):
match items:
case []:
return "пусто"
case [x]:
return f"один элемент: {x}"
case [first, *rest]:
return f"голова {first}, хвост из {len(rest)}"
| Образец | Смысл |
|---|---|
[x, y] | Ровно два элемента |
[first, *rest] | Первый + остаток в список rest |
(_, _, third) | Третий элемент кортежа |
Работает с list, tuple и другими последовательностями при сопоставлении по структуре.
Словари и ключевые поля
def parse_event(event: dict):
match event:
case {"type": "click", "x": x, "y": y}:
return f"клик в ({x}, {y})"
case {"type": "key", "code": code}:
return f"клавиша {code}"
case {"type": str(t)}:
return f"неизвестный тип {t}"
case _:
return "не событие"
Имена ключей в образце — обязательные для совпадения; лишние ключи в словаре не мешают (в отличие от некоторых языков с «закрытыми» образцами).
Классы и dataclass
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
def quadrant(p):
match p:
case Point(x=0, y=0):
return "начало координат"
case Point(x=x, y=y) if x >= 0 and y >= 0:
return "I четверть"
case Point(x=x, y=y):
return f"точка ({x}, {y})"
Сопоставление идёт по атрибутам, не по иерархии наследования (для иерархии классов по-прежнему удобен полиморфизм — см. ООП).
AS — привязка имени
match response:
case {"status": 200, "data": data} as ok:
process(ok["data"])
case {"status": code, "error": msg}:
log_error(code, msg)
as ok сохраняет всё совпавшее значение response, а не только извлечённые части.
match и if/elif
| Критерий | if / elif | match / case |
|---|---|---|
| Простое сравнение | Предпочтительно | Избыточно |
| Много веток по одной переменной | Длинные цепочки | Читаемее |
| Распаковка структур | Вложенные if и индексы | Нативно в образце |
| Произвольные условия между ветками | Любые выражения | Только guards на case |
| Версия Python | Любая | 3.10+ |
Для кода, который должен работать на 3.9 и ниже, match недоступен — оставляйте if/elif или словари-диспетчеры.
Типичные ошибки
- Забыли
case _— при несовпадении возникнетMatchError(аналог необработанного случая). - Изменяемые значения — образец сопоставляет текущее состояние; список может измениться после
match, если на него есть другие ссылки. - Порядок веток — более общий образец сверху «перехватит» частные случаи; специфичные
caseставят выше общих.
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Python как язык общего назначения - философия, ключевые свойства и области применения в современной разработке. Python — это высокоуровневый язык программирования общего назначения, который отличается читаемым синтаксисом и широким спектром применения. Принципы, которые делают код понятным, поддерживаемым и расширяемым. Примеры реализации типовых приложений. Каждый пример сопровождается разбором ключевых концепций языка. Наверняка каждый новичок, решивший перейти в что-то стандартное в Python, открывает себе этот файл. Как устроен Python, что входит в комплект и какие есть реализации. Структурные каркасы для построения приложений, как они устроены. Фреймворки, библиотеки, инструменты сборки, среды выполнения, системы тестирования и специализированные платформы, объединённые общей философией ясности, простоты и гибкости. Что такое модули, как устроены механизмы импорта и загрузки. Управление изолированной средой и зависимостями проекта. История Python - ключевые этапы развития языка, сообщества и экосистемы инструментов. Философия Python не зафиксирована в официальных стандартах, но она глубоко интегрирована в язык, его стандартную библиотеку, документацию и культуру разработчиков.Python - язык общего назначения
Что требуется знать перед началом изучения языка программирования Python
Рекомендации по разработке на Python
Простые приложения на Python
Встроенный модуль builtins и типизация в Python
Архитектура интерпретатора Python
Фреймворки и библиотеки Python
Экосистема Python-приложений
Модули в Python
Виртуальные окружения и управление зависимостями
История языка Python
Философия Python - Zen of Python