Guido van Rossum pwopoze ajoute operatè matche modèl nan Python

Guido van Rossum entwodwi bouyon pou revizyon kominote a espesifikasyon pou aplike modèl matche operatè (matche ak ka) nan Python. Li ta dwe remake ke pwopozisyon pou ajoute operatè matche modèl yo te deja pibliye an 2001 ak 2006 (pep-0275, pep-3103), men yo te rejte an favè optimize konstriksyon "si ... elif ... lòt moun" pou konpile chenn matche.

Nouvo aplikasyon an sanble ak operatè "match" yo bay nan Scala, Rust, ak F#, ki konpare rezilta yon ekspresyon espesifye ak yon lis modèl ki nan lis nan blòk ki baze sou operatè "ka" la. Kontrèman ak operatè "switch" ki disponib nan C, Java, ak JavaScript, ekspresyon ki baze sou "matche" yo ofri plis ankò. lajè fonksyonalite. Li te note ke operatè yo pwopoze yo pral amelyore lizibilite nan kòd la, senplifye konparezon an nan objè abitrè Python ak debogaj, epi tou ogmante fyab nan kòd la akòz posibilite pou pwolonje. tcheke kalite estatik.

def http_error(estati):
sitiyasyon matche ak:
ka 400:
retounen "Move demann"
ka 401|403|404:
retounen "Pa pèmèt"
ka 418:
retounen "Mwen se yon teyèr"
ka_:
retounen "Yon lòt bagay"

Pou egzanp, ou ka depake objè, tuple, lis, ak sekans abitrè pou mare varyab ki baze sou valè ki egziste deja. Li pèmèt yo defini modèl imbrike, sèvi ak kondisyon adisyonèl "si" nan modèl la, itilize mask ("[x, y, *rès]"), kat kle/valè (pa egzanp, {"bandwidth": b, "latency ”: l} ekstrè valè "latè" ak "latansi" ak diksyonè), ekstrè submodèl (":=" operatè), sèvi ak konstan yo nonmen nan modèl. Nan klas yo, li posib pou pèsonalize konpòtman matche ak metòd "__match__()".

soti nan dataclasses enpòte dataclass

@dataclass
Pwen klas:
x:int
y:int

def whereis(pwen):
pwen match:
Pwen ka (0, 0):
enprime ("Orijin")
ka Pwen(0, y):
enprime(f"Y={y}")
ka Pwen (x, 0):
enprime(f"X={x}")
Pwen ka ():
enprime ("Yon lòt kote")
ka_:
enprime ("Pa yon pwen")

pwen match:
ka Pwen(x, y) si x == y:
enprime(f"Y=X nan {x}")
Pwen ka (x, y):
enprime(f"Pa sou dyagonal la")

WOUJ, VÈT, BLE = 0, 1, 2
matche ak koulè:
ka .RED:
enprime ("Mwen wè wouj!")
ka .GREEN:
enprime ("Zèb vèt")
ka .BLU
E:
print("Mwen santi blues yo :(")

Yo te prepare yon seri pou revizyon plak ak eksperimantal aplikasyon spesifikasyon pwopoze, men vèsyon final la toujou diskite. Pou egzanp ofri Olye de ekspresyon "ka _:" pou valè default la, sèvi ak mo kle "else:" oswa "default:", paske "_" nan lòt kontèks yo itilize kòm yon varyab tanporè. Epitou dout se òganizasyon entèn la, ki baze sou tradwi nouvo ekspresyon an bytecode ki sanble ak sa yo itilize pou konstwi "si ... elif ... lòt bagay", ki pa pral bay pèfòmans ou vle lè w ap trete yon seri gwo konparezon.

Sous: opennet.ru

Add nouvo kòmantè