MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Restricții ale șabloanelor sau guard-uri

Guard-urile sau restricțiile șabloanelor permit stabilirea unor condiții suplimentare pe care expresia trebuie să le îndeplinească. Restricția este stabilită imediat după șablon, folosind cuvântul cheie if, urmat de condiția de restricție:

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}, acces interzis")
       case Person(name=name):
           print(f"{name}, bine ai venit!")


enter(Person("Tom", 37))        # Tom, bine ai venit!
enter(Person("Sam", 12))        # Sam, acces interzis

Aici, primul șablon:

case Person(name=name, age=age) if age < 18:
   print(f"{name}, acces interzis")

Corespunde oricărui obiect Person al cărui atribut age este mai mic de 18 ani. De fapt, partea if age < 18 reprezintă restricția. Astfel, dacă utilizatorul are o vârstă mai mică de 18 ani, se va afișa un mesaj, iar dacă are peste 18 ani, se va afișa un alt mesaj.

În mod similar, se pot introduce restricții suplimentare:

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}, acces interzis")
       case Person(name=name, age=age) if age < 22:
           print(f"{name}, acces limitat")
       case Person(name=name):
           print(f"{name}, ai acces complet!")


enter(Person("Tom", 37))        # Tom, ai acces complet!
enter(Person("Bob", 20))        # Bob, acces limitat
enter(Person("Sam", 12))        # Sam, acces interzis

Condițiile de restricție pot fi mai complexe și structurate:

def check_data(data):
   match data:
       case name, age if name == "admin" or age not in range(1, 101):
           print("Valori incorecte")
       case name, age:
           print(f"Date verificate. Nume: {name}  Vârstă: {age}")


check_data(("admin", -45))      # Valori incorecte
check_data(("Tom", 37))         # Date verificate. Nume: Tom  Vârstă: 37

În acest caz, funcția primește un tuplu data. Ambele șabloane din construcția match corespund unui tuplu cu două elemente. Dar primul șablon aplică, de asemenea, restricția name == "admin" or age not in range(1, 101), conform căreia primul element al tuplului trebuie să aibă valoarea "admin", iar al doilea trebuie să fie în afara intervalului 1-101.

← Lecția anterioară Lecția următoare →