Что такое конструкции match/case в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Конструкции match/case в Python, введенные в версии 3.10, предоставляют механизм структурного сопоставления с образцом (structural pattern matching). Это позволяет сравнивать значение выражения со списком образцов и выполнять блок кода, соответствующий первому совпавшему образцу.
Основные элементы:
match: Ключевое слово, вводящее блок сопоставления. За ним следует выражение, значение которого будет сопоставляться.case: Ключевое слово для определения образца. За ним следует сам образец. Если значение выражения изmatchсовпадает с образцом изcase, выполняется код, находящийся внутри этого блокаcase.- Образцы: Могут быть простыми литералами (числа, строки, булевы значения), именованными константами, списками, кортежами, словарями с определенной структурой, а также включать записывающие переменные (которые захватывают совпавшие части значения) и защитные условия (с помощью
if).
Пример базового использования:
// Функция, возвращающая описание HTTP-статуса
def get_http_status_description(status_code):
match status_code:
case 200:
return "OK"
case 404:
return "Not Found"
case 500:
return "Internal Server Error"
case _: // Wildcard pattern - совпадает с любым значением
return "Unknown Status"
// Использование функции
print(get_http_status_description(200))
print(get_http_status_description(404))
print(get_http_status_description(999))
Пример сопоставления с составными структурами и записывающими переменными:
// Пример данных (кортеж or список)
point = (1, 2)
command = ["move", 10, 20]
user_data = {"name": "Alice", "age": 30}
// Сопоставление с кортежем
match point:
case (x, y):
// x и y захватывают значения из кортежа
print(f"Point coordinates: x={x}, y={y}")
// Сопоставление со списком
match command:
case ["move", dx, dy]:
// dx и dy захватывают значения из списка
print(f"Move by dx={dx}, dy={dy}")
case ["wait", time]:
print(f"Wait for {time} seconds")
case _:
print("Unknown command")
// Сопоставление со словарем
match user_data:
case {"name": name, "age": age}:
// name и age захватывают значения из словаря
print(f"User: {name}, Age: {age}")
case {"name": name}: // Совпадение по имени, возраст необязателен
print(f"User: {name} (age not specified)")
case _:
print("Invalid user data")
Пример с защитным условием:
// Функция с защитным условием
def process_number(n):
match n:
case int() if n > 0:
// Совпадает, только если n является целым и больше 0
print(f"Positive integer: {n}")
case int() if n < 0:
// Совпадает, только если n является целым и меньше 0
print(f"Negative integer: {n}")
case 0:
// Совпадает с нулем
print("Zero")
case _:
// Совпадает с любым другим значением
print(f"Non-integer or zero: {n}")
// Использование функции
process_number(5)
process_number(-3)
process_number(0)
process_number(3.14)
Преимущества match/case:
- Читаемость: Улучшает читаемость кода по сравнению с длинными цепочками
if/elif/else, особенно при сопоставлении с различными типами данных и структурами. - Безопасность типа: Позволяет проверять тип данных в образце.
- Извлечение данных: Упрощает извлечение данных из сложных структур (списков, кортежей, словарей) непосредственно в процессе сопоставления.
- Выразительность: Предоставляет более выразительный способ обработки множественных условий, основанных на структуре и значении данных.
Отличия от if/elif/else:
match/case более специализирован для сопоставления формы и структуры данных, тогда как if/elif/else используется для проверки условий на основе значений или выражений. match/case предоставляет более компактный и семантически более подходящий способ для сценариев, где требуется выполнить различные действия в зависимости от типа или структуры входных данных.