Guards ou Restrições de Padrões no Pattern Matching - 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
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 negado
Aqui, o primeiro padrão:
case Person(name=name, age=age) if age < 18:
print(f"{name}, acesso negado")
Corresponde a qualquer objeto Person
age
if age < 18
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 negado
As 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: 37
Neste caso, a função recebe uma tupla data
match
name == "admin" or age not in range(1, 101)
"admin"