Guido van Rossum va proposar afegir operadors de concordança de patrons a Python

Guido van Rossum introduït esborrany per a la revisió de la comunitat especificacions per implementar operadors de concordança de patrons (concordança i majúscules) a Python. Cal tenir en compte que les propostes per afegir operadors de concordança de patrons ja s'han publicat els anys 2001 i 2006 (pep-0275, pep-3103), però van ser rebutjats a favor d'optimitzar la construcció "si ... elif ... sinó" per compilar cadenes coincidents.

La nova implementació s'assembla molt a l'operador "coincidència" proporcionat a Scala, Rust i F#, que compara el resultat d'una expressió especificada amb una llista de patrons llistats en blocs basats en l'operador "cas". A diferència de l'operador "switch" disponible en C, Java i JavaScript, les expressions basades en "concordança" ofereixen molt més àmplia funcionalitat. Cal assenyalar que els operadors proposats milloraran la llegibilitat del codi, simplificaran la comparació d'objectes arbitraris de Python i la depuració, i també augmentaran la fiabilitat del codi gràcies a la possibilitat d'ampliar-se. comprovació de tipus estàtic.

def http_error(estat):
estat de coincidència:
cas 400:
retornar "Petició incorrecta"
cas 401|403|404:
retornar "No permès"
cas 418:
retornar "Sóc una tetera"
Caixa_:
retornar "Alguna cosa més"

Per exemple, podeu desempaquetar objectes, tuples, llistes i seqüències arbitràries per enllaçar variables basades en valors existents. Es permet definir plantilles imbricades, utilitzar condicions addicionals "si" a la plantilla, utilitzar màscares ("[x, y, *rest]"), mapes clau/valor (per exemple, {"amplada de banda": b, "latencia") ”: l} per extreure valors i diccionari d'"amplada de banda" i "latencia", extreu subplantilles ("operador:="), utilitzeu constants anomenades a la plantilla. A les classes, és possible personalitzar el comportament de concordança mitjançant el mètode "__match__()".

de classes de dades importar classe de dades

@dataclass
Punt de classe:
x:int
y:int

def whereis(punt):
punt de partit:
cas Punt (0, 0):
print("Origen")
cas Punt(0, y):
imprimir(f"Y={y}")
cas Punt (x, 0):
imprimir(f"X={x}")
Case Point():
print("En un altre lloc")
Caixa_:
print("No és un punt")

punt de partit:
cas Punt(x, y) si x == y:
imprimir(f"Y=X a {x}")
cas Punt (x, y):
print(f"No a la diagonal")

VERMELL, VERD, BLAU = 0, 1, 2
coincideix amb el color:
cas .VERMELL:
print("Veig vermell!")
estoig .VERD:
print("L'herba és verda")
cas .BLU
E:
print(“Estic sentint el blues :(“)

S'ha preparat un conjunt per a la seva revisió pegats amb experimental implementació especificació proposada, però la versió final encara és discutit. Per exemple ofert En lloc de l'expressió "case _:" per al valor predeterminat, utilitzeu la paraula clau "else:" o "default:", ja que "_" en altres contextos s'utilitza com a variable temporal. També és qüestionable l'organització interna, que es basa en traduir noves expressions en bytecode similar a la que s'utilitza per a les construccions "if ... elif ... else", que no proporcionarà el rendiment desitjat quan es processen conjunts molt grans de comparacions.

Font: opennet.ru

Afegeix comentari