Guido van Rossum ha proposto di aggiungere operatori di corrispondenza dei modelli a Python

Guido van Rossum presentata bozza per la revisione comunitaria specificazione per implementare gli operatori di corrispondenza dei modelli (match e case) in Python. Va notato che proposte per aggiungere operatori di patternmatching sono già state pubblicate nel 2001 e nel 2006 (pep-0275, pep-3103), ma furono respinti a favore dell'ottimizzazione del costrutto "if ... elif ... else" per la compilazione di catene di corrispondenza.

La nuova implementazione è molto simile all'operatore "match" fornito in Scala, Rust e F#, che confronta il risultato di un'espressione specificata con un elenco di modelli elencati in blocchi in base all'operatore "case". A differenza dell'operatore "switch" disponibile in C, Java e JavaScript, le espressioni basate su "match" offrono molto di più ampia funzionalità. Si noti che gli operatori proposti miglioreranno la leggibilità del codice, semplificheranno il confronto di oggetti Python arbitrari e il debugging e aumenteranno anche l'affidabilità del codice grazie alla possibilità di estensioni estese controllo del tipo statico.

def http_errore(stato):
stato della partita:
caso 400:
restituire "Richiesta errata"
caso 401|403|404:
ritorna "Non consentito"
caso 418:
return "Sono una teiera"
caso _:
return "Qualcos'altro"

Ad esempio, puoi decomprimere oggetti, tuple, elenchi e sequenze arbitrarie per associare variabili in base a valori esistenti. È consentito definire modelli nidificati, utilizzare condizioni "if" aggiuntive nel modello, utilizzare maschere ("[x, y, *rest]"), mappature chiave/valore (ad esempio, {"bandwidth": b, "latency ”: l} per estrarre i valori e il dizionario "larghezza di banda" e "latenza"), estrarre i modelli secondari (":=" operatore), utilizzare costanti con nome nel modello. Nelle classi è possibile personalizzare il comportamento di abbinamento utilizzando il metodo “__match__()”.

da classi di dati import classe di dati

@dataclass
Punto di classe:
x:int
y:int

def dov'è(punto):
match point:
caso Punto(0, 0):
stampa("Origine")
caso Punto(0, y):
print(f"Y={y}")
caso Punto(x, 0):
stampa(f"X={x}")
caso Punto():
print("Da qualche altra parte")
caso _:
print("Non è questo il punto")

match point:
caso Punto(x, y) se x == y:
print(f"Y=X alle {x}")
caso Punto(x, y):
print(f"Non sulla diagonale")

ROSSO, VERDE, BLU = 0, 1, 2
abbinare il colore:
caso .RED:
print("Vedo rosso!")
caso .VERDE:
print("L'erba è verde")
caso .BLU
E:
print("Mi sento triste :(")

È stato preparato un set per la revisione cerotti con sperimentale implementazione specifica proposta, ma la versione finale è ancora in discussione. Ad esempio, offerta Invece dell'espressione "case _:" per il valore predefinito, utilizzare la parola chiave "else:" o "default:", poiché "_" in altri contesti viene utilizzato come variabile temporanea. Altrettanto discutibile è l'organizzazione interna, che si basa sulla traduzione di nuove espressioni in bytecode simile a quello utilizzato per i costrutti "if ... elif ... else", che non fornirà le prestazioni desiderate durante l'elaborazione di insiemi di confronti molto grandi.

Fonte: opennet.ru

Aggiungi un commento