Guards ou Restrições de Padrões no Pattern Matching em Python
Guards ou restrições de padrões permitem estabelecer condições adicionais que uma expressão deve satisfazer. A restrição é definida logo após o padrão, usando a palavra-chave if, seguida pela condição da restrição:
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}, acesso negado")
case Person(name=name):
print(f"{name}, bem-vindo!")
enter(Person("Tom", 37)) # Tom, bem-vindo!
enter(Person("Sam", 12)) # Sam, acesso negadoAqui, o primeiro padrão:
case Person(name=name, age=age) if age < 18:
print(f"{name}, acesso negado")Corresponde a qualquer objeto Person cujo atributo age seja menor que 18. A parte if age < 18 representa a restrição. Assim, se a idade do usuário for menor que 18, uma mensagem será exibida; caso contrário, outra mensagem será apresentada.
De forma similar, é possível introduzir restrições adicionais:
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}, acesso negado")
case Person(name=name, age=age) if age < 22:
print(f"{name}, acesso limitado")
case Person(name=name):
print(f"{name}, você tem acesso total!")
enter(Person("Tom", 37)) # Tom, você tem acesso total!
enter(Person("Bob", 20)) # Bob, acesso limitado
enter(Person("Sam", 12)) # Sam, acesso negadoAs condições de restrição podem ser mais complexas e compostas:
def check_data(data):
match data:
case name, age if name == "admin" or age not in range(1, 101):
print("Valores incorretos")
case name, age:
print(f"Dados verificados. Nome: {name} Idade: {age}")
check_data(("admin", -45)) # Valores incorretos
check_data(("Tom", 37)) # Dados verificados. Nome: Tom Idade: 37Neste caso, a função recebe uma tupla data. Ambos os padrões na construção match correspondem a uma tupla de dois elementos. Porém, o primeiro padrão também aplica a restrição name == "admin" or age not in range(1, 101), na qual o primeiro elemento da tupla deve ser "admin" ou o segundo deve estar fora do intervalo de 1 a 100.
Documentação oficial: