guards или ограничения шаблонов

Последнее обновление: 01.02.2022

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

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


def enter(person):
    match person:
        case Person(name=name, age=age) if age < 18:
            print(f"{name}, доступ запрещен")
        case Person(name=name):
            print(f"{name}, добро пожаловать!")


enter(Person("Tom", 37))        # Tom, добро пожаловать!
enter(Person("Sam", 12))        # Sam, доступ запрещен

Здесь первый шаблон

case Person(name=name, age=age) if age < 18:
    print(f"{name}, доступ запрещен")

Соответствует любому объекту Person, у которого атрибут age меньше 18. Собственно часть if age < 18 и представляет ограничение. Соответственно, если у пользователя возраст меньше 18, то будет выводьтся одно сообщение, если больше 18, то другое.

Подобным образом можно вводить дополнительные ограничения:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


def enter(person):
    match person:
        case Person(name=name, age=age) if age < 18:
            print(f"{name}, доступ запрещен")
        case Person(name=name, age=age) if age < 22:
            print(f"{name}, доступ  ограничен")
        case Person(name=name):
            print(f"{name}, у вас полноценный доступ!")


enter(Person("Tom", 37))        # Tom, у вас полноценный доступ!
enter(Person("Bob", 20))        # Bob, доступ  ограничен
enter(Person("Sam", 12))        # Sam, доступ запрещен

Условия ограничений могут быть более сложными и составными по структуре:

def check_data(data):
    match data:
        case name, age if name == "admin" or age not in range(1, 101):
            print("Некорректные значения")
        case name, age:
            print(f"Данные проверены. Name: {name}  Age: {age}")


check_data(("admin", -45))      # Некорректные значения
check_data(("Tom", 37))         # Данные проверены. Name: Tom  Age: 37

В данном случае функция получает кортеж data. Оба шаблона в конструкции match соответствуют двухэлементному кортежу. Но первый шаблон также применяет ограничение name == "admin" or age not in range(1, 101), в соответствии с которым первый элемент кортежа должен иметь значение "admin", а второй должен находиться вне диапазона 1-101.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850