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.