Guido van Rossum propozoi shtimin e operatorëve të përputhjes së modelit në Python

Guido van Rossum paraqitur draft për shqyrtim nga komuniteti specifikimet për zbatimin e operatorëve të përputhjes së modeleve (përputhja dhe rasti) në Python. Duhet të theksohet se propozimet për të shtuar operatorë të përputhjes së modeleve janë publikuar tashmë në 2001 dhe 2006 (pep-0275, pep-3103), por u refuzuan në favor të optimizimit të konstruksionit "nëse ... elif ... tjetër" për përpilimin e zinxhirëve të përputhjes.

Zbatimi i ri është shumë i ngjashëm me operatorin "match" të ofruar në Scala, Rust dhe F#, i cili krahason rezultatin e një shprehjeje të specifikuar me një listë modelesh të listuara në blloqe bazuar në operatorin "rast". Ndryshe nga operatori "switch" i disponueshëm në C, Java dhe JavaScript, shprehjet e bazuara në "match" ofrojnë shumë më tepër funksionalitet të gjerë. Vihet re se operatorët e propozuar do të përmirësojnë lexueshmërinë e kodit, do të thjeshtojnë krahasimin e objekteve arbitrare të Python dhe korrigjimin, si dhe do të rrisin besueshmërinë e kodit falë mundësisë së zgjatjes kontrollimi i tipit statik.

def http_error(status):
statusi i ndeshjes:
rasti 400:
kthej "kërkesë e keqe"
rasti 401|403|404:
kthehu "Nuk lejohet"
rasti 418:
kthehu "Unë jam një çajnik"
rast_:
kthej "Diçka tjetër"

Për shembull, mund të shpaketoni objekte, tuple, lista dhe sekuenca arbitrare për të lidhur variabla bazuar në vlerat ekzistuese. Lejohet të përcaktohen shabllone të ndërthurur, të përdoren kushte shtesë "nëse" në shabllon, përdorimi i maskave ("[x, y, *rest]"), pasqyrimet e çelësave/vlerave (për shembull, {"gjerësia e brezit": b, "latenca ”: l} për të nxjerrë vlerat dhe fjalorin e "gjerësisë së brezit" dhe "latencës", nxjerr nën-shabllonet (":=" operatori), përdorni konstante të emërtuara në shabllon. Në klasa, është e mundur të personalizoni sjelljen e përputhjes duke përdorur metodën "__match__()".

nga klasa e të dhënave importon klasën e të dhënave

@dataclass
Pika e klasës:
x:int
y:int

defini ku është (pika):
pika e ndeshjes:
rasti Pika (0, 0):
print ("Origjina")
rasti Pika (0, y):
print(f"Y={y}")
rasti Pika (x, 0):
print(f"X={x}")
case Point():
print ("Diku tjetër")
rast_:
print ("Asnjë pikë")

pika e ndeshjes:
rasti Pika (x, y) nëse x == y:
print (f"Y=X në {x}")
rasti Pika (x, y):
print (f"Jo në diagonale")

E KUQE, E GJELBËR, BLU = 0, 1, 2
ngjyra e ndeshjes:
rasti .KUQ:
print ("Unë shoh të kuqe!")
rasti .E GJELBËR:
print ("Bari është jeshil")
rasti .BLU
E:
print ("Po ndjej bluesin :(")

Një grup është përgatitur për shqyrtim arna me eksperimentale zbatimi specifikimet e propozuara, por versioni përfundimtar është ende diskutohet. Për shembull, ofruar Në vend të shprehjes "rast _:" për vlerën e paracaktuar, përdorni fjalën kyçe "tjetër:" ose "default:", pasi "_" në kontekste të tjera përdoret si një variabël i përkohshëm. Gjithashtu i diskutueshëm është organizimi i brendshëm, i cili bazohet në përkthimin e shprehjeve të reja në bytekod të ngjashëm me atë të përdorur për konstruktet "if ... elif ... else", i cili nuk do të sigurojë performancën e dëshiruar kur përpunohen grupe shumë të mëdha krahasimesh.

Burimi: opennet.ru

Shto një koment