Guido van Rossum proponis aldoni padronkongruajn funkciigistojn al Python

Guido van Rossum enkondukita skizo por komunuma revizio specifoj por efektivigado de ŝablono-kongruaj funkciigistoj (kongruo kaj uskleco) en Python. Oni devas rimarki, ke proponoj por aldoni ŝablonkongruajn funkciigistojn jam estis publikigitaj en 2001 kaj 2006 (pep-0275, pep-3103), но были отвергнуты в пользу оптимизации конструкции «if … elif … else» для составления цепочек сопоставления.

La nova efektivigo estas tre kiel la "matĉa" funkciigisto provizita en Scala, Rust, kaj F#, kiu komparas la rezulton de specifita esprimo kun listo de ŝablonoj listigitaj en blokoj bazitaj sur la "kaza" funkciigisto. Male al la "ŝaltilo" funkciigisto disponebla en C, Java kaj JavaScript, "matĉaj"-bazitaj esprimoj ofertas multe pli larĝa funkcieco. Oni rimarkas, ke la proponitaj operatoroj plibonigos la legeblecon de la kodo, simpligos la komparon de arbitraj Python-objektoj kaj elpurigadon, kaj ankaŭ pliigos la fidindecon de la kodo danke al la ebleco de etendita. senmova tipo-kontrolado.

def http_eraro(stato):
kongrua stato:
kazo 400:
revenu "Malbona peto"
kazo 401|403|404:
reveni "Ne permesite"
kazo 418:
return "Mi estas tekruĉo"
kazo_:
resendi "Ion alian"

Ekzemple, vi povas malpaki objektojn, opoj, listojn kaj arbitrajn sekvencojn por ligi variablojn bazitajn sur ekzistantaj valoroj. Estas permesite difini nestitajn ŝablonojn, uzi pliajn "se" kondiĉojn en la ŝablono, uzi maskojn ("[x, y, *rest]"), ŝlosil/valorajn mapadojn (ekzemple, {"bandwidth": b, "latency" ”: l} por ĉerpi "bendolarĝon" kaj "latenteco" valorojn kaj vortaron), ĉerpi subŝablonojn (":=" operatoro), uzu nomitajn konstantojn en ŝablono. En klasoj, eblas personecigi kongruan konduton uzante la metodon "__match__()".

el datumklasoj importu datumklason

@dataclass
klasa Punkto:
x:int
y:int

def whereis(punkto):
matĉopunkto:
kazo Punkto (0, 0):
print("Origino")
kazo Punkto(0, y):
print(f"Y={y}")
kazo Punkto (x, 0):
print(f"X={x}")
kazo Punkto():
print("Ie aliloke")
kazo_:
print ("Ne punkto")

matĉopunkto:
kazo Punkto(x, y) se x == y:
print(f"Y=X ĉe {x}")
kazo Punkto (x, y):
print(f"Ne sur la diagonalo")

RUĜA, VERDA, BLUA = 0, 1, 2
kongrua koloro:
kazo .RED:
print("Mi vidas ruĝan!")
kazo .VERDA:
print("Herbo estas verda")
kazo .BLU
E:
print ("Mi sentas la bluson :(")

Aro estis preparita por revizio flikiloj kun eksperimenta efektivigo proponita specifo, sed la fina versio ankoraŭ estas diskutita. Ekzemple proponis Anstataŭ la esprimo "case _:" por la defaŭlta valoro, uzu la ŝlosilvorton "else:" aŭ "default:", ĉar "_" en aliaj kuntekstoj estas uzata kiel provizora variablo. Ankaŭ pridubebla estas la interna organizo, kiu baziĝas sur tradukado de novaj esprimoj en bajtkodon similan al tiu uzata por "se ... elif ... alie" konstrukcioj, kiuj ne provizos la deziratan agadon dum prilaborado de tre grandaj aroj de komparoj.

fonto: opennet.ru

Aldoni komenton