Python Match Case: что это такое и как его использовать

Python Match Case: What It Is & How To Use It

На протяжении многих лет в Python постоянно вводились новые функции, повышающие удобство использования программистами.

 

Одной из таких функций, добавленной в Python 3.10, является оператор сопоставления регистров. Оператор match case обеспечивает новый уровень удобства и читаемости кода Python.

 

Оператор match позволяет выполнять сопоставление значений с образцом. Он поощряет более читабельные и выразительные способы деструктуризации и проверки данных путем сравнения значения с несколькими возможными шаблонами с помощью оператора match..

Более того, он обеспечивает более понятную альтернативу глубоко вложенному оператору if-elif-else.

 

В этой статье мы рассмотрим оператор Python Match Case. Мы рассмотрим синтаксис, примеры и варианты использования оператора match case, чтобы помочь вам лучше понять концепции.

 

Давайте займемся этим!

Случай совпадения Python

 

Содержание

Каков синтаксис совпадения регистра в Python?

 

Основной синтаксис оператора match case приведен ниже:

match expression_to_match:
    case pattern1:
        # Code block for pattern1
    case pattern2:
        # Code block for pattern2
    ...
    case patternN:
        # Code block for patternN
    case _:
        # Catch-all, default code block (optional)

Этот фрагмент кода оценивает выражение_to_match и сравнивает его с несколькими шаблонами (шаблон1, шаблон2, …, шаблонN).

Когда совпадение найдено, соответствующий блок кода выполняется.

 

Если ни один из шаблонов не соответствует и существует универсальный случай ‘_‘ выполняется блок кода по умолчанию. Это более выразительный способ обработки условной логики, аналогичный оператору переключения в других языках.

 

Ниже приведен простой пример случая совпадения, иллюстрирующий синтаксис:

Простой пример совпадения

В этом примере:

  1. Оператор match выполняет сопоставление структурного шаблона, проверяя значение Икс.
  2. Шаблоны проверяются последовательно. Как только шаблон совпадает, соответствующий ему блок кода выполняется, и дальнейшие шаблоны не проверяются.
  3. Использование ул(у) и интервал (х) в данном случае шаблоны — это шаблоны типов, которые соответствуют значениям определенных типов и привязывают их к указанным именам переменных.

 

Оператор match case аналогичен оператору switch в других языках, таких как Java и C++.

 

4 разновидности шаблонов в совпадении регистров в Python

 

Вы можете использовать совпадения по регистру в различных приложениях, поэтому существует множество разновидностей шаблонов.

 

В этом разделе мы покажем вам 4 разновидности узора. В частности, мы рассмотрим следующее:

  1. Деструктуризация с помощью шаблонов
  2. Образцы букв и имен
  3. Шаблоны подстановочных знаков и ИЛИ
  4. Типовые шаблоны и защита
4 разновидности узоров в спичечном футляре

1. Что такое деструктуризация с помощью шаблонов?

 

Деструктуризация с помощью шаблонов означает разбиение структуры данных на составные части и сопоставление этих частей с определенными шаблонами.

Это способ доступа к внутренней части структуры данных (например, кортежей, списков или словарей) в процессе сопоставления с образцом.

 

Предположим, у нас есть список 2D-точек, представленный в виде кортежей. Мы хотим определить точки, лежащие на оси X или оси Y.

Следующий код демонстрирует описанный выше сценарий:

 

Деструктуризация с помощью шаблонов с несколькими значениями

 

В этом примере:

  1. Кортеж (0, y) деструктурирует точку, сопоставляя любой кортеж, где первый элемент равен 0 (что указывает на то, что он находится на оси Y), и привязывает второй элемент к y. Ключевое слово match инициирует оператор match case.
  2. Аналогично, кортеж (x, 0) соответствует любой точке на оси X и привязывает координату X к x.

 

2. Что такое шаблоны букв и имен?

 

Буквальные шаблоны соответствуют конкретным константным значениям. Общие шаблоны литералов включают числа, строки, True, False, None и даже перечисление ценности.

 

С другой стороны, шаблоны имен привязывают совпадающее значение к переменной. Если вы используете шаблон имени, какое бы значение ни оценивал оператор match, оно будет привязано к этому имени на время соответствующего блока case.

Рассмотрим функцию, которая интерпретирует различные командные строки и выдает ответы:

 

Пример шаблонов литералов и имен для соответствия статусу

 

В приведенном выше коде:

  1. «Старт» и «стоп» — это буквальные шаблоны. Они соответствуют точным строковым значениям «start» и «stop» соответственно.
  2. cmd — это шаблон имени. Если значение cmd не соответствует ни одному из предыдущих шаблонов, оно привязывается к cmd, а его значение затем используется в форматировании строки в операторе return.

 

3. Что такое шаблоны подстановочных знаков и ИЛИ?

 

Шаблоны подстановочных знаков представлены подчеркиванием (_). Шаблон подстановочного знака соответствует любому значению, но не привязывает его к имени. Его часто используют как универсальный шаблон, когда другие шаблоны не совпадают.

 

OR Patterns позволяет комбинировать несколько шаблонов с помощью | оператор. Соответствующий блок кода выполняется, если какой-либо из объединенных шаблонов совпадает.

 

Предположим, у нас есть функция, которая классифицирует числа на основе определенных свойств. Рассмотрим следующий код:

Пример подстановочного знака и/или соответствующего шаблона с необязательными аргументами

В этом примере:

  1. 0 это буквальный шаблон.
  2. 1 | 2 | 3 представляет собой шаблон ИЛИ, который соответствует, если n равно 1, 2 или 3.
  3. _ является шаблоном подстановки, который соответствует любому значению n, еще не соответствующему предыдущим шаблонам.

 

4. Что такое шаблоны шрифтов и защиты?

 

Шаблоны типов позволяют сопоставлять значения в зависимости от их типа. Вы также можете деструктурировать и связать значение во время сопоставления, если оно соответствует ожидаемому типу.

 

Защитники — это условные выражения, которые можно добавить в регистр для дальнейшего уточнения сопоставления с образцом.

 

Соответствующий блок case будет выполняться только в том случае, если шаблон соответствует и условие защиты имеет значение True.

Они полезны при работе с более сложным сопоставлением с образцом.

Допустим, вы пишете функцию для описания различных типов входных данных. Рассмотрим следующие операторы переключения:

 

Базовый пример шаблонов типов и средств защиты с использованием ключевого слова case

 

В этом примере:

  1. int(x), если x > 0 представляет собой шаблон типа в сочетании с защитой. Значение соответствует, если оно имеет тип int и больше 0.
  2. сtr(s), если len(s) < 5 соответствует значениям типа ул. длиной менее 5.

 

Вы можете вызвать функцию с различными входными данными, как показано ниже:

print(describe_input(10))       # Should print: "Positive integer: 10"
print(describe_input(-3))       # Should print: "Non-positive integer: -3"
print(describe_input("hello"))  # Should print: "String: hello"

 

4 применения регистра совпадений в Python

 

В приведенных выше разделах мы изучили синтаксис и разновидности шаблонов совпадений. Давайте продолжим и применим на практике то, что мы уже узнали.

 

Читайте дальше, мы рассмотрим 4 применения спичечных коробок.

В частности, мы рассмотрим следующее:

  1. Анализ структуры данных
  2. Государственные машины
  3. Тип Диспетчеризация
  4. Обработка ошибок и проверка
4 применения спичечного дела

 

1. Анализ структуры данных

 

При работе со сложными структурами данных, особенно с вложенными, регистр совпадений упрощает процесс извлечения и проверки.

 

Например, при анализе абстрактных синтаксических деревьев (AST) или JSON-подобных структур сопоставление с образцом может сделать код значительно более читабельным за счет сокращения вложенных условных проверок.

 

Рассмотрим следующий пример, в котором мы сопоставляем определенные фигуры со списком геометрических дескрипторов:

Пример разбора структуры данных

В приведенном выше примере выполняется перебор списка фигур, каждая из которых описана словарем.

 

Используя сопоставление с образцом, он идентифицирует круги и прямоугольники на основе их «типа» и соответствующих размеров.

 

После идентификации он распечатывает характеристики формы: либо радиус круга, либо ширину и высоту прямоугольника.

 

Вы можете использовать если еще операторы для выполнения вышеуказанных операций. Однако с если вам придется написать глубоко вложенный блок кода, что не рекомендуется.

 

2. State Machines

 

В приложениях, где объект может находиться в нескольких состояниях (например, игровой персонаж или сетевой протокол), случай совпадения предлагает четкий способ обработки переходов состояний и связанных с ними действий.

 

Рассмотрим следующий пример, в котором мы обрабатываем типы сетевых пакетов по упрощенному протоколу:

 

Пример конечных автоматов

Код оценивает объект пакета, используя сопоставление последовательностей шаблонов Python.

В зависимости от типа и структуры пакета — будь то Connect, Disconnect или Message — код извлекает соответствующие данные, такие как имя пользователя или содержимое сообщения, а затем вызывает соответствующую функцию-обработчик (handle_connect, handle_disconnect или процесс_сообщение) с извлеченными данными.

3. Тип диспетчеризации

Оператор match может заменить сложную логику проверки типов, когда поведение зависит от типов входных данных. Он предлагает более чистую альтернативу таким методам, как isinstance().

 

Рассмотрим следующий пример, в котором мы обрабатываем различные типы входных данных в общей функции:

 

Пример диспакции типов в ветке случая

Функция процесса использует сопоставление с образцом Python для определения типа входных данных.

 

В зависимости от того, являются ли данные целым числом, строкой или списком, обработка делегируется соответствующему пользователю. handle_integer, handle_stringили handle_list функции, передавая фактическое значение выбранному обработчику.

 

4. Обработка ошибок и проверка

 

Для функций, ожидающих определенных форматов или значений, сопоставление шаблонов можно использовать для проверки, возврата ошибок или обработки исключений, когда данные не соответствуют ожидаемым шаблонам.

Рассмотрим следующий пример проверки ответов API:

 

# 1. Define the handler functions:
def process_data(content):
    print(f"Processing data: {content}")

def log_error(msg):
    print(f"Error encountered: {msg}")

# 2. Create a sample api_response. You can change this to test different scenarios:
api_response = {
    "status": "success",
    "data": {"content": "Sample API data"}
}

# Provided code:
match api_response:
    case {"status": "success", "data": dict(content)}:
        process_data(content)
    case {"status": "error", "message": str(msg)}:
        log_error(msg)

 

Код проверяет api_responseкоторый, как ожидается, будет словарем, использующим сопоставление с образцом Python.

 

Если ответ содержит статус «успех» вместе со связанными данными, данные обработки функция вызывается с этими данными.

 

С другой стороны, если статус «ошибка» и появляется сообщение об ошибке, журнал_ошибка функция вызывается с предоставленным сообщением об ошибке.

 

Пример обработки ошибок и проверки

 

Усовершенствуйте свое путешествие по Python с помощью Code Interpreter, посмотрев следующее видео:

Последние мысли

Когда вы пишете сложные приложения, потребность в кратком и читаемом коде становится все более важной. Случай совпадения — это инструмент, который позволяет легко классифицировать и обрабатывать различные структуры данных или условия.

Изучение случая совпадения гарантирует, что ваш код будет более удобным в сопровождении и интуитивно понятным. Он позволяет сжать обширную логику в несколько строк кода.

Существует множество вариантов использования этого оператора, и со временем, работая над более обширными проектами, вы часто будете использовать его для написания чистого и эффективного кода.

 

Часто задаваемые вопросы

 

В этом разделе вы найдете некоторые часто задаваемые вопросы, которые могут возникнуть у вас при работе со спичечными регистрами.

Программист-мужчина пишет код Python

Какова альтернатива сопоставлению регистра в Python?

 

До появления оператора match case в Python 3.10 разработчики обычно использовали операторы if или операторы if-elif-else или словари для реализации структур, подобных переключателям.

Эти альтернативы по-прежнему можно использовать в более старых версиях Python или если вы предпочитаете не использовать оператор сопоставления с регистром для определенного сценария.

 

Как я могу использовать регулярное выражение для сопоставления регистра в Python?

 

Чтобы использовать регулярные выражения для сопоставления регистра в операторе сопоставления случаев Python, импортируйте ре модуль и использовать re.match(шаблон, строка) в условиях дела.

 

повторный матч Функция возвращает объект соответствия, если шаблон найден во входной строке.

import re

input_string = "some text"
match input_string:
    case re.match(r"\d+", input_string):
        # Matched a number
    case re.match(r"[a-zA-Z]+", input_string):
        # Matched a word
    case _:
        # Default case

Как применить провал в операторе сопоставления случаев Python?

 

Python не допускает явного отказа в операторах сопоставления регистров, как в конструкциях переключения регистра в некоторых других языках.

Вместо этого вы можете использовать шаблон последовательности для проверки нескольких случаев в одном операторе случая:

match value:
    case "a" | "b" | "c":
        # Code for handling cases a, b, and c

Могу ли я сопоставить регистр на основе типа данных в Python?

 

Да, вы можете использовать оператор match case для сопоставления на основе типа данных значения:

 

value = 5
match value:
    case int():
        # Matched integer
    case str():
        # Matched string
    case _:
        # Default case

Как справиться с оператором сопоставления случаев Python с перечислениями?

 

Вы можете использовать оператор match case с перечислениями Python, сопоставляя конкретное значение Enum:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

color = Color.RED
match color:
    case Color.RED:
        # Matched red
    case Color.GREEN:
        # Matched green
    case Color.BLUE:
        # Matched blue

Есть ли способ использовать регистр совпадений для подстрок в Python?

 

Да, вы можете использовать в для сопоставления регистра с подстроками в операторе сопоставления регистров Python:

input_string = "This is a test"
match input_string:
    case _ if "test" in input_string:
        # Matched substring 'test'
    case _:
        # Default case