match / case în Python

Structuri de control Python 3.10+

Compară o valoare cu mai multe modele (pattern matching), ca un switch mult mai puternic.

Sintaxă
match valoare:
    case model1:
        ...
    case model2 | model3:
        ...
    case _:
        ...

Ce face match / case

match ia o valoare și o compară, pe rând, cu modelele din ramurile case. Se execută prima ramură potrivită. case _: prinde orice altceva, ca un else.

Modelele pot fi valori simple, alternative cu |, liste și tupluri despachetate (case [x, y]:), dicționare (case {"tip": "email"}:) sau obiecte (case Punct(x=0):). O condiție suplimentară se pune cu if după model.

match și case sunt „cuvinte cheie soft”: au sens special doar în această construcție, deci pot fi folosite în continuare ca nume de variabile.

Exemple

Exemplul 1: Valori simple și alternative

def tip_zi(zi):
    match zi:
        case "sâmbătă" | "duminică":
            return "weekend"
        case "luni":
            return "început de săptămână"
        case _:
            return "zi lucrătoare"

for zi in ["luni", "miercuri", "duminică"]:
    print(zi, "->", tip_zi(zi))

Rezultat

luni -> început de săptămână
miercuri -> zi lucrătoare
duminică -> weekend

Exemplul 2: Despachetarea unei comenzi

def executa(comanda):
    match comanda.split():
        case ["mergi", directie]:
            return f"Merg spre {directie}"
        case ["ia", *obiecte] if obiecte:
            return f"Iau: {', '.join(obiecte)}"
        case ["ieși"]:
            return "La revedere"
        case _:
            return "Comandă necunoscută"

for c in ["mergi nord", "ia cheie lanternă", "ia", "ieși"]:
    print(executa(c))

Rezultat

Merg spre nord
Iau: cheie, lanternă
Comandă necunoscută
La revedere

Exemplul 3: Dicționare

evenimente = [
    {"tip": "comanda", "id": 101, "total": 250},
    {"tip": "plata", "suma": 250},
    {"tip": "necunoscut"},
]
for e in evenimente:
    match e:
        case {"tip": "comanda", "id": id_comanda}:
            print("Comandă nouă:", id_comanda)
        case {"tip": "plata", "suma": suma} if suma > 0:
            print("Plată primită:", suma)
        case _:
            print("Ignorat:", e)

Rezultat

Comandă nouă: 101
Plată primită: 250
Ignorat: {'tip': 'necunoscut'}

Greșeli frecvente

  • Scrii case STARE: crezând că se compară cu variabila STARE. Un nume simplu prinde orice valoare și o salvează în acel nume. Folosește un nume cu punct (Stari.ACTIV) sau o condiție if.
  • Folosești match pe Python mai vechi de 3.10 și primești SyntaxError.

Comenzi înrudite

  • if / elif / else: Execută un bloc de cod doar dacă o condiție este adevărată.
  • dict (dicționare): Dicționarul păstrează perechi cheie: valoare și găsește rapid valoarea după cheie.
  • class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).