Антон Ларичев
Оператор match/case в Python 3.10+ — основы структурного сопоставления
Введение
Начиная с Python 3.10, в языке появился оператор структурного сопоставления с образцом — match/case. Он позволяет сравнивать значение с набором шаблонов и выполнять соответствующий блок кода. Это не просто замена цепочки if/elif/else — match/case умеет деструктурировать данные, проверять типы и выполнять сложное сопоставление.
В этой статье мы разберём базовый синтаксис match/case, покажем как работать с литералами, переменными и подстановочным символом _, а также сравним новый оператор с классическим if/elif.
Базовый синтаксис match/case
Оператор match принимает выражение и последовательно проверяет его по шаблонам в блоках case. Как только найдено совпадение, выполняется соответствующий блок кода, а остальные шаблоны пропускаются.
# Базовый пример match/case
def get_status_message(code):
match code:
case 200:
return "OK"
case 404:
return "Не найдено"
case 500:
return "Внутренняя ошибка сервера"
case _:
return f"Неизвестный код: {code}"
# Вызов функции
print(get_status_message(200)) # OK
print(get_status_message(404)) # Не найдено
print(get_status_message(418)) # Неизвестный код: 418
Здесь _ — это подстановочный шаблон (wildcard), который совпадает с любым значением. Он работает аналогично блоку else в конструкции if/elif/else.
Сопоставление с литералами
Самый простой случай — сопоставление с конкретными значениями: числами, строками, булевыми значениями и None.
# Сопоставление со строковыми литералами
def handle_command(command):
match command:
case "start":
print("Запуск программы")
case "stop":
print("Остановка программы")
case "restart":
print("Перезапуск программы")
case "help":
print("Доступные команды: start, stop, restart, help")
case _:
print(f"Неизвестная команда: {command}")
handle_command("start") # Запуск программы
handle_command("quit") # Неизвестная команда: quit
# Сопоставление с None и булевыми значениями
def check_value(value):
match value:
case None:
print("Значение отсутствует")
case True:
print("Истина")
case False:
print("Ложь")
case _:
print(f"Другое значение: {value}")
check_value(None) # Значение отсутствует
check_value(True) # Истина
check_value(42) # Другое значение: 42
Захват значения в переменную
Если в шаблоне case указать имя без кавычек и не являющееся литералом, Python привяжет совпавшее значение к этой переменной.
# Захват значения в переменную
def describe_number(value):
match value:
case 0:
print("Ноль")
case n:
# Переменная n захватывает любое значение
print(f"Число: {n}, квадрат: {n ** 2}")
describe_number(0) # Ноль
describe_number(5) # Число: 5, квадрат: 25
Важно помнить, что переменная-захват совпадает с любым значением, поэтому её стоит ставить последней — иначе до остальных шаблонов дело не дойдёт.
Объединение шаблонов через оператор OR
Оператор | позволяет объединять несколько шаблонов в одном case. Если значение совпадёт хотя бы с одним из них, блок будет выполнен.
# Объединение шаблонов через |
def classify_day(day):
match day:
case "понедельник" | "вторник" | "среда" | "четверг" | "пятница":
return "Рабочий день"
case "суббота" | "воскресенье":
return "Выходной"
case _:
return "Неизвестный день"
print(classify_day("среда")) # Рабочий день
print(classify_day("суббота")) # Выходной
# Объединение числовых шаблонов
def http_category(code):
match code:
case 200 | 201 | 204:
return "Успех"
case 301 | 302:
return "Перенаправление"
case 400 | 401 | 403 | 404:
return "Ошибка клиента"
case 500 | 502 | 503:
return "Ошибка сервера"
case _:
return "Неизвестный код"
print(http_category(201)) # Успех
print(http_category(403)) # Ошибка клиента
Если вы хотите детальнее изучить Python и его современные возможности — приходите на наш большой курс Python-разработчик с нуля. На курсе 210 уроков и 150 упражнений, AI-тренажёры для практики 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Сравнение match/case с if/elif/else
Рассмотрим одну и ту же логику, записанную через if/elif и через match/case.
# Вариант с if/elif/else
def get_color_if(color):
if color == "red":
return "#FF0000"
elif color == "green":
return "#00FF00"
elif color == "blue":
return "#0000FF"
else:
return None
# Вариант с match/case
def get_color_match(color):
match color:
case "red":
return "#FF0000"
case "green":
return "#00FF00"
case "blue":
return "#0000FF"
case _:
return None
В простых случаях match/case выглядит чище и читабельнее. Однако главное его преимущество проявляется при работе со сложными структурами данных — деструктуризацией кортежей, списков и объектов. Об этом мы расскажем в отдельной статье.
Важные особенности
Стоит знать несколько особенностей оператора match/case:
- Порядок шаблонов важен — Python проверяет шаблоны сверху вниз и выполняет первый совпавший
- Нет fall-through — в отличие от
switchв C/Java, после выполнения совпавшего блока остальные не проверяются - Шаблон
_не обязателен — если ни один шаблон не совпал, ничего не происходит - Переменная-захват перезаписывает — если в текущей области видимости уже есть переменная с таким именем, она будет перезаписана
# Демонстрация перезаписи переменной
x = 10
match 42:
case x:
# x теперь равен 42, а не 10!
print(f"x = {x}")
print(f"x после match = {x}") # x после match = 42
Частые ошибки
- Использование переменной вместо литерала — если написать
case status_ok:вместоcase 200:, Python не сравнит значение с переменнойstatus_ok, а создаст новую привязку. Для сопоставления с константами используйте точечную нотацию:case http.HTTPStatus.OK: - Забытый подстановочный шаблон — без
case _:при отсутствии совпадений не произойдёт ничего, что может быть неочевидным поведением - Использование match/case в Python ниже 3.10 — оператор доступен только начиная с Python 3.10, в более ранних версиях вы получите
SyntaxError
Частозадаваемые вопросы
Можно ли использовать match/case в Python 3.9 и ниже?
Нет, оператор match/case доступен только начиная с Python 3.10 (PEP 634). Для более ранних версий используйте цепочку if/elif/else или словарь с маппингом.
Чем match/case отличается от switch/case в других языках?
В отличие от switch в C, Java или JavaScript, оператор match/case в Python — это полноценное структурное сопоставление с образцом (pattern matching). Он умеет деструктурировать данные, проверять типы и формы объектов, а не только сравнивать с конкретными значениями.
Влияет ли match/case на производительность?
Для простых случаев производительность match/case сопоставима с цепочкой if/elif. Преимущество проявляется в читаемости кода и при работе со сложными структурами данных.
Заключение
Оператор match/case в Python 3.10+ — это мощный инструмент для управления потоком выполнения программы. В базовом варианте он заменяет цепочку if/elif/else, делая код чище и выразительнее. Подстановочный шаблон _ обеспечивает обработку случаев по умолчанию, а оператор | позволяет объединять несколько шаблонов.
Для закрепления навыков работы с Python и его современными возможностями рекомендуем курс Python-разработчик с нуля. В первых 3 модулях курса доступно бесплатное содержание, что позволяет разобраться в основах языка и понять структуру курса до покупки полного доступа.
Постройте личный план изучения Python до уровня Middle — бесплатно!
Python — часть карты развития Backend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Все гайды по Python
Лучшие курсы по теме

Основы Python
Антон Ларичев
Nest.js с нуля
Антон Ларичев