Guido van Rossum hà prupostu l'aghjunghje l'operatori di currispundenza di mudelli à Python

Guido van Rossum introduttu draft per a revisione di a cumunità quaternu per implementà l'operatori di currispondenza di mudelli (match and case) in Python. Hè da nutà chì e pruposte per aghjunghje l'operatori di currispondenza di mudelli sò digià publicate in 2001 è 2006 (pep-0275, pep-3103), ma sò stati rifiutati in favore di l'ottimisazione di a custruzzione "se ... elif ... else" per a compilazione di catene currispondenti.

A nova implementazione hè assai cum'è l'operatore "match" furnitu in Scala, Rust è F#, chì compara u risultatu di una espressione specifica cù una lista di mudelli listati in blocchi basatu annantu à l'operatore "casu". A cuntrariu di l'operatore "switch" dispunibule in C, Java è JavaScript, l'espressioni basate in "match" offrenu assai più larga funziunalità. Hè nutatu chì l'operatori pruposti migliurà a leghjibilità di u codice, simplificà u paragone di l'oggetti arbitrarii Python è u debugging, è ancu aumentà l'affidabilità di u codice per via di a pussibilità di allargamentu. cuntrollu di tipu staticu.

def http_error(status):
status di partita:
casu 400:
turnà "Domanda cattiva"
casu 401|403|404:
vultà "Micca permessu"
casu 418:
torna "Sò una teiera"
casu_:
torna "Qualcosa d'altru"

Per esempiu, pudete unpack objects, tuples, listi, è sequenze arbitrarie per ligà variabili basati nantu à i valori esistenti. Hè permessu di definisce mudelli nidificati, aduprate cundizioni supplementari "se" in u mudellu, utilizate maschere ("[x, y, *rest]"), mappings chjave / valore (per esempiu, {"larghezza di banda": b, "latency". ”: l} per estrattà i valori di "larghezza di banda" è "latenza" è u dizziunariu), estrae i sottotemplate (":=" operatore), utilizate custanti chjamati in u mudellu. In e classi, hè pussibule persunalizà u cumportamentu currispondente cù u metudu "__match__()".

da classi di dati importa classi di dati

@dataclass
Puntu di classa:
x:int
y:int

def whereis (puntu):
match point:
Puntu di casu (0, 0):
print("Origine")
Puntu di casu (0, y):
print(f"Y={y}")
Puntu di casu (x, 0):
print(f"X={x}")
Case Point():
print("In un altru locu")
casu_:
print ("Micca un puntu")

match point:
casu Puntu (x, y) se x == y:
print(f"Y=X à {x}")
Puntu di casu (x, y):
print(f"Micca nantu à a diagonale")

RED, VERDE, BLU = 0, 1, 2
currisponde à u culore:
casu .RED:
print ("Vecu rossu!")
casu .VERDE :
print("L'erba hè verde")
casu .BLU
E:
print("Senti u blues :(“)

Un set hè statu preparatu per rivisione patchs cun esperimentu messa in opera specificazione pruposta, ma a versione finale hè sempre discutitu. Per esempiu, hè prupostu Invece di l'espressione "case _:" per u valore predeterminatu, aduprate a keyword "else:" o "default:", postu chì "_" in altri cuntesti hè utilizatu cum'è una variabile tempurale. Hè ancu discutibile l'urganizazione interna, chì hè basatu annantu à a traduzzione di novi espressioni in bytecode simili à quellu utilizatu per i custruzzioni "se ... elif ... else", chì ùn furnisce micca u rendiment desideratu quandu si tratta di gruppi assai grandi di paraguni.

Source: opennet.ru

Add a comment