Atualizado: 04/11/2024

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, 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 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 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 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. 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.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com