Pattern matching позволяет проверить наличие в словаре определнных ключей и значений:
def look(words): match words: case {"red": "красный", "blue": "синий"}: # если в словаре words слова red и blue print("Слова red и blue есть в словаре") case {"red": "красный"}: # если в словаре words есть слово red print("Слово red есть в словаре, а слово blue отсутствует") case {"blue": "синий"}: # если в словаре words есть слово blue print("Слово blue есть в словаре, а слово red отсутствует") case {}: print("Слова red и blue в словаре отсутствует") case _: print("Это не словарь") look({"red": "красный", "blue": "синий", "green": "зеленый"}) # Слова red и blue есть в словаре look({"red": "красный", "green": "зеленый"}) # Слово red есть в словаре, а слово blue отсутствует look({"blue": "синий", "green": "зеленый"}) # Слово blue есть в словаре, а слово red отсутствует look({"green": "зеленый"}) # Слова red и blue в словаре отсутствует look("yelllow") # Это не словарь
Здесь предполагается, что в функцию look передается словарь. Первый шаблон
case {"red": "красный", "blue": "синий"}: # если в словаре words слова red и blue print("Слова red и blue есть в словаре")
соответствует словарю, в котором есть два элемента со следующими ключами и значениями: "red": "красный"
и
"blue": "синий"
.
Второй шаблон ({"red": "красный"}
) соответствует любому словарю, где есть элемент "red": "красный"
.
Аналогично третий шаблон ({"blue": "синий"}
) соответствует любому словарю, где есть элемент "blue": "синий"
Четвертый шаблон - case {}
соответствует в принципе любому словарю.
Последний шаблон соответствует любому значению и применяется на случай, если в функцию передан не словарь.
С помощью вертикальной черты | можно определить альтернативные значения:
def look(words): match words: case {"red": "красный" | "алый" | "червонный"}: # если значение "красный", "алый" или "червонный" print("Слово red есть в словаре") case {}: print("Слово red в словаре отсутствует или имеет некорректное значение") look({"red": "красный", "green": "зеленый"}) # Слово red есть в словаре look({"red": "алый", "green": "зеленый"}) # Слово red есть в словаре look({"green": "зеленый"}) # Слово red в словаре отсутствует или имеет некорректное значение
В данном случае шаблон {"red": "красный" | "алый" | "червонный"}
соответствует словарю, в котором есть элемент с ключом
"red" и значением "красный" или "алый" или "червонный".
Также можно задать альтернативный набор словарей:
def look(words): match words: case {"red": "красный"} | {"blue": "синий"} : print("либо red, либо blue есть в словаре") case {}: print("надо проверить слова red и blue") look({"red": "красный", "green": "зеленый"}) # либо red, либо blue есть в словаре look({"blue": "синий", "green": "зеленый"}) # либо red, либо blue есть в словаре look({"green": "зеленый"}) # надо проверить слова red и blue
Первый шаблон - {"red": "красный"} | {"blue": "синий"}
соответствует словарю, в котором есть либо элемент
{"red": "красный"}
, или {"blue": "синий"}
, или оба.
Если нам важны сами ключи, но не важно значение ключей, то вместо конкретных значений можно передать шаблон _:
def look(words): match words: case {"red": _, "blue": _}: print("Слова red и blue есть в словаре") case {}: print("red и/или blue отсутствуют в словаре") look({"red": "красный", "blue": "синий"}) # Слова red и blue есть в словаре look({"red": "алый", "blue": "синий"}) # Слова red и blue есть в словаре look({"red": "красный", "green": "зеленый"}) # red и/или blue отсутствуют в словаре
Pattern matching позволяет получить значения элементов в переменные в виде:
{ключ: переменная}
Например:
def look(words): match words: case {"red": red, "blue": blue}: print(f"red: {red} blue: {blue}") case {}: print("надо проверить слова red и blue") look({"red": "красный", "blue": "синий"}) # red: красный blue: синий look({"red": "алый", "blue": "синий"}) # red: алый blue: синий
В первом шаблоне значение элемента с ключом "red" попадает в переменную red, а элемента с ключом "blue" - в переменную blue.
С помощью символов ** (двойная звездочка) можно получить остальные элементы словаря:
def look(words): match words: case {"red": red, **rest}: print(f"red: {red}") for key in rest: # rest - тоже словарь print(f"{key}: {rest[key]}") look({"red": "красный", "blue": "синий", "green": "зеленый"}) # red: красный # blue: синий # green: зеленый
Здесь шаблон {"red": red, **rest}
соответствует любому словарь, в котором есть элемент с ключом "red". Все остальные
элементы словаря помещаются в параметр rest, который сам в свою очередь представляет словарь.