Iminungkahi ni Guido van Rossum ang pagdaragdag ng mga operator ng pagtutugma ng pattern sa Python

Guido van Rossum ipinakilala draft para sa pagsusuri ng komunidad mga pagtutukoy para sa pagpapatupad ng mga operator ng pagtutugma ng pattern (tugma at kaso) sa Python. Dapat tandaan na ang mga panukala upang magdagdag ng mga operator ng pagtutugma ng pattern ay nai-publish na noong 2001 at 2006 (pep-0275, pep-3103), ngunit tinanggihan sa pabor ng pag-optimize ng “if ... elif ... else” construct para sa pag-compile ng mga katugmang chain.

Ang bagong pagpapatupad ay katulad ng "tugma" na operator na ibinigay sa Scala, Rust, at F#, na naghahambing sa resulta ng isang tinukoy na expression sa isang listahan ng mga pattern na nakalista sa mga bloke batay sa operator na "case". Hindi tulad ng operator na "switch" na available sa C, Java, at JavaScript, ang mga expression na nakabatay sa "tugma" ay nag-aalok ng higit pa malawak na pag-andar. Napansin na ang mga iminungkahing operator ay mapapabuti ang pagiging madaling mabasa ng code, gawing simple ang paghahambing ng mga arbitrary na bagay sa Python at pag-debug, at dagdagan din ang pagiging maaasahan ng code salamat sa posibilidad ng pinalawig static na uri ng pagsusuri.

def http_error(status):
katayuan ng tugma:
kaso 400:
ibalik ang "Masamang kahilingan"
kaso 401|403|404:
ibalik ang "Hindi pinapayagan"
kaso 418:
bumalik "ako ay isang tsarera"
kaso_:
ibalik ang "Ibang bagay"

Halimbawa, maaari mong i-unpack ang mga bagay, tuple, listahan, at arbitrary na pagkakasunud-sunod upang i-bind ang mga variable batay sa mga umiiral nang value. Pinapayagan na tukuyin ang mga nested na template, gumamit ng karagdagang "kung" kundisyon sa template, gumamit ng mga mask ("[x, y, *rest]"), key/value mappings (halimbawa, {"bandwidth": b, "latency ”: l} upang kunin ang mga halaga at diksyunaryo ng "bandwidth" at "latency", kunin ang mga subtemplates (":=" operator), gumamit ng pinangalanang mga constant sa template. Sa mga klase, posibleng i-customize ang pagtutugma ng gawi gamit ang "__match__()" na paraan.

mula sa mga dataclass ay nag-import ng dataclass

@dataclass
Punto ng klase:
x:int
y:int

def whereis(point):
match point:
case Point(0, 0):
print("Pinagmulan")
case Point(0, y):
print(f"Y={y}")
case Point(x, 0):
print(f"X={x}")
case Point():
print("Sa ibang lugar")
kaso_:
print("Hindi isang punto")

match point:
case Point(x, y) kung x == y:
print(f"Y=X sa {x}")
case Point(x, y):
print(f"Wala sa dayagonal")

RED, GREEN, BLUE = 0, 1, 2
kulay ng tugma:
kaso .RED:
print ("Nakikita ko ang pula!")
kaso .BERDE:
print("Ang damo ay berde")
kaso .BLU
E:
print(«I’m feeling the blues :(«)

Isang set ang inihanda para sa pagsusuri mga patch may eksperimental pagpapatupad iminungkahing detalye, ngunit ang huling bersyon ay pa rin tinalakay. Halimbawa inaalok Sa halip na ang expression na "case _:" para sa default na halaga, gamitin ang keyword na "else:" o "default:", dahil ang "_" sa ibang mga konteksto ay ginagamit bilang isang pansamantalang variable. Kaduda-duda din ang panloob na organisasyon, na nakabatay sa pagsasalin ng mga bagong expression sa bytecode na katulad ng ginamit para sa mga konstruksyon na "if ... elif ... else", na hindi magbibigay ng nais na pagganap kapag nagpoproseso ng napakalaking hanay ng mga paghahambing.

Pinagmulan: opennet.ru

Magdagdag ng komento