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 variabilaSTARE. Un nume simplu prinde orice valoare și o salvează în acel nume. Folosește un nume cu punct (Stari.ACTIV) sau o condițieif. - Folosești
matchpe Python mai vechi de 3.10 și primeștiSyntaxError.
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).