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.