Gvido van Rosums ierosināja Python pievienot modeļu saskaņošanas operatorus

Gvido van Rosums ieviesa projekts kopienas pārskatīšanai specifikācijas paraugu saskaņošanas operatoru (atbilstības un reģistra) ieviešanai Python. Jāatzīmē, ka priekšlikumi pievienot modeļu saskaņošanas operatorus jau ir publicēti 2001. un 2006. gadā (pep-0275, pep-3103), taču tika noraidīti par labu konstruktīvas “if ... elif ... else” optimizēšanai atbilstošo ķēžu apkopošanai.

Jaunā ieviešana ir līdzīga Scala, Rust un F# nodrošinātajam operatoram "match", kas salīdzina noteiktas izteiksmes rezultātu ar modeļu sarakstu, kas uzskaitīts blokos, pamatojoties uz operatoru "case". Atšķirībā no operatora "switch", kas pieejams C, Java un JavaScript, uz "match" balstītas izteiksmes piedāvā daudz vairāk plaša funkcionalitāte. Tiek atzīmēts, ka piedāvātie operatori uzlabos koda lasāmību, vienkāršos patvaļīgu Python objektu salīdzināšanu un atkļūdošanu, kā arī palielinās koda uzticamību, pateicoties paplašināšanas iespējai. statiskā tipa pārbaude.

def http_error(status):
atbilstības statuss:
400 gadījums:
atgriezt "slikts pieprasījums"
gadījums 401|403|404:
atgriezt "Nav atļauts"
418 gadījums:
atgriezt "Es esmu tējkanna"
case_:
atgriezt "kaut ko citu"

Piemēram, varat izpakot objektus, korešus, sarakstus un patvaļīgas secības, lai saistītu mainīgos, pamatojoties uz esošajām vērtībām. Ir atļauts definēt ligzdotas veidnes, veidnē izmantot papildu “if” nosacījumus, izmantot maskas (“[x, y, *rest]”), atslēgu/vērtību kartējumus (piemēram, {“joslas platums”: b, “latency” ”: l}, lai izvilktu "joslas platuma" un "latences" vērtības un vārdnīcu), izvilktu apakšveidnes (operators ":="), veidnē izmantojiet nosauktās konstantes. Klasēs ir iespējams pielāgot atbilstības uzvedību, izmantojot metodi “__match__()”.

no dataclasses importēt dataclass

@dataklase
klases punkts:
x:int
y:int

def whereis(punkts):
spēles punkts:
gadījuma punkts (0, 0):
drukāt ("Izcelsme")
gadījuma punkts (0, y):
drukāt (f"Y={y}")
gadījuma punkts (x, 0):
drukāt (f"X={x}")
gadījuma punkts ():
drukāt ("kaut kur citur")
case_:
drukāt ("Nav nozīmes")

spēles punkts:
gadījuma punkts(x, y), ja x == y:
drukāt (f"Y=X plkst. {x}")
gadījuma punkts (x, y):
drukāt (f"Nav pa diagonāli")

SARKANS, ZAĻS, ZILS = 0, 1, 2
atbilst krāsa:
korpuss .RED:
drukāt ("Es redzu sarkanu!")
korpuss .GREEN:
drukāt ("Zāle ir zaļa")
korpuss .BLU
E:
print("Es jūtu blūzu :(")

Pārskatīšanai ir sagatavots komplekts ielāpus ar eksperimentālu īstenošanu piedāvātā specifikācija, bet galīgā versija joprojām ir apspriests. Piemēram, piedāvāja Izteiciena "case _:" vietā noklusējuma vērtībai izmantojiet atslēgvārdu "else:" vai "default:", jo citos kontekstos "_" tiek izmantots kā pagaidu mainīgais. Apšaubāma ir arī iekšējā organizācija, kuras pamatā ir jaunu izteiksmju tulkošana baitkodā, kas ir līdzīgs “if ... elif ... else” konstrukcijām izmantotajam, kas nenodrošinās vēlamo veiktspēju, apstrādājot ļoti lielas salīdzinājumu kopas.

Avots: opennet.ru

Pievieno komentāru