In Python 3.10 è stato introdotto il meccanismo di pattern matching strutturale, l'operatore match-case. Storicamente in Python le condizioni complesse venivano realizzate tramite catene if/elif/else, il che era scomodo per l'analisi di strutture annidate (ad esempio, dizionari, tuple annidate).
Problema — le verifiche annidate complesse diventano poco leggibili e difficili da mantenere. L'approccio basato su match-case consente di descrivere in modo conciso le verifiche con lo scomposizione delle variabili e le condizioni guard.
Soluzione — usare la sintassi match-case, che consente di confrontare la struttura di un oggetto (dizionari, tuple, liste) con un dato pattern ed estrarre i dati.
Esempio di codice:
point = (1, 2) match point: case (0, 0): print('Origine') case (0, y): print(f'Y={y}') case (x, 0): print(f'X={x}') case (x, y): print(f'X={x}, Y={y}')
Caratteristiche chiave:
È possibile utilizzare match-case per condizioni if-elif-else normali su valori singoli?
Sì, tuttavia la forza di match-case sta nella struttura. Per condizioni discrete semplici è simile a switch-case nei linguaggi come C.
È possibile utilizzare match-case con oggetti immutabili (ad esempio, str)?
Sì, match-case funziona con qualsiasi oggetto che può essere confrontato con un pattern, comprese le stringhe e i numeri.
Esempio di codice:
color = 'red' match color: case 'red': print('È rosso') case 'blue': print('È blu') case _: print('Colore sconosciuto')
Qual è l'errore che si verifica quando si confrontano oggetti con nomi di variabili uguali nel contesto esterno?
Il pattern matching assegna le variabili localmente all'interno di case, indipendentemente dal contesto esterno. Questo può causare confusione se il nome della variabile è già utilizzato esternamente.
Usano match-case per una grande catena if-elif-else con costanti semplici.
Pro:
Contro:
Si elabora un flusso di strutture JSON annidate da un'API, per le quali diversi casi richiedono differenti estrazioni di dati da diversi livelli della struttura.
Pro:
Contro: