Guido van Rossum javasolta a mintaillesztő operátorok hozzáadását a Pythonhoz

Guido van Rossum benyújtott tervezet közösségi felülvizsgálatra specifikációk mintaillesztési operátorok (match and case) megvalósításához Pythonban. Megjegyzendő, hogy 2001-ben és 2006-ban már megjelentek javaslatok mintaillesztő operátorok hozzáadására (pep-0275, pep-3103), de elutasították az „if ... elif ... else” konstrukció optimalizálása mellett az illeszkedő láncok fordítására.

Az új megvalósítás nagyon hasonlít a Scala, Rust és F# által biztosított "match" operátorhoz, amely egy meghatározott kifejezés eredményét hasonlítja össze a "case" operátor alapján blokkokban felsorolt ​​minták listájával. A C, Java és JavaScript nyelvekben elérhető "switch" operátorral ellentétben a "match" alapú kifejezések sokkal többet kínálnak széles körű funkcionalitás. Megjegyzendő, hogy a javasolt operátorok javítani fogják a kód olvashatóságát, leegyszerűsítik a tetszőleges Python-objektumok összehasonlítását és a hibakeresést, valamint növelik a kód megbízhatóságát a kiterjesztési lehetőségnek köszönhetően. statikus típusellenőrzés.

def http_error(status):
mérkőzés állapota:
400 eset:
„Rossz kérés” visszaküldése
401|403|404 eset:
"Nem engedélyezett" visszaküldése
418 eset:
return "teáskanna vagyok"
ügy_:
visszaküldi a "valami mást"

Például kicsomagolhat objektumokat, sorokat, listákat és tetszőleges sorozatokat a változók meglévő értékek alapján történő összekapcsolásához. Megengedett beágyazott sablonok definiálása, további „if” feltételek használata a sablonban, maszkok („[x, y, *rest]”), kulcs/érték-leképezések (például {“sávszélesség”: b, „latency” ”: l} a "sávszélesség" és a "latencia" értékek és a szótár kinyeréséhez, alsablonok kibontásához (":=" operátor), nevesített konstansok használata a sablonban. Az osztályokban lehetőség van az illeszkedési viselkedés testreszabására a „__match__()” metódussal.

adatosztályokból importálja az adatosztályt

@adatosztály
osztály pont:
x:int
y:int

def whereis(pont):
meccspont:
esetpont(0, 0):
nyomtatás ("Eredet")
esetpont(0, y):
print(f"Y={y}")
esetpont(x, 0):
print(f"X={x}")
esetpont():
print ("Valahol máshol")
ügy_:
print ("Nem lényeg")

meccspont:
eset Pont(x, y), ha x == y:
print(f"Y=X at {x}")
eset Pont(x, y):
print(f"Nem az átlón")

PIROS, ZÖLD, KÉK = 0, 1, 2
egyezés színe:
tok .RED:
print ("Látok pirosat!")
tok .GREEN:
print ("A fű zöld")
tok .BLU
E:
print("Érzem a bluest :(")

Elkészült egy készlet felülvizsgálatra foltok kísérletivel végrehajtás javasolt specifikáció, de a végleges verzió még mindig megvan megbeszélték. Például felajánlott Az alapértelmezett érték "case _:" kifejezés helyett használja az "else:" vagy "default:" kulcsszót, mivel más összefüggésekben a "_" ideiglenes változóként használatos. Megkérdőjelezhető a belső szervezés is, amely az „if ... elif ... else” konstrukciókhoz hasonló új kifejezések bájtkódba való fordításán alapul, amely nem biztosítja a kívánt teljesítményt nagyon nagy összehasonlítási halmazok feldolgozásakor.

Forrás: opennet.ru

Hozzászólás