Guido van Rossum ehdotti mallinsovitusoperaattorien lisäämistä Pythoniin

Guido van Rossum toimitettu luonnos yhteisön tarkastettavaksi tekniset tiedot kuvion täsmäytysoperaattoreiden (match and case) toteuttamiseen Pythonissa. On huomattava, että ehdotuksia mallinsovitusoperaattoreiden lisäämiseksi on julkaistu jo vuosina 2001 ja 2006 (pep-0275, pep-3103), mutta ne hylättiin "if ... elif ... else" -rakenteen optimoinnin puolesta vastaavien ketjujen kääntämistä varten.

Uusi toteutus muistuttaa paljolti Scalassa, Rustissa ja F#:ssa tarjottua "match"-operaattoria, joka vertaa määritetyn lausekkeen tulosta "case"-operaattorin perusteella lohkoittain lueteltuun malliluetteloon. Toisin kuin C-, Java- ja JavaScript-kielissä käytettävissä oleva "switch"-operaattori, "match"-pohjaiset lausekkeet tarjoavat paljon enemmän laaja toiminnallisuus. On huomattava, että ehdotetut operaattorit parantavat koodin luettavuutta, yksinkertaistavat mielivaltaisten Python-objektien vertailua ja virheenkorjausta sekä lisäävät koodin luotettavuutta laajentamismahdollisuuden ansiosta. staattinen tyyppitarkastus.

def http_error(status):
ottelun tila:
tapaus 400:
palauttaa "huono pyyntö"
tapaus 401|403|404:
palauttaa "Ei sallittu"
tapaus 418:
palauta "Olen teekannu"
case_:
palauttaa "jotain muuta"

Voit esimerkiksi purkaa objektit, monikot, luettelot ja mielivaltaiset sekvenssit sitoaksesi muuttujia olemassa olevien arvojen perusteella. On sallittua määrittää sisäkkäisiä malleja, käyttää "jos"-lisäehtoja mallissa, käyttää maskeja ("[x, y, *rest]"), avain/arvo-määrityksiä (esim. {"kaistanleveys": b, "latenssi" ”: l} poimia "kaistanleveys" ja "latenssi"-arvot ja sanakirja, purkaa alimalleja (":="-operaattori), käytä nimettyjä vakioita mallissa. Luokissa on mahdollista mukauttaa täsmäytyskäyttäytymistä "__match__()" -menetelmällä.

dataluokista tuo dataluokka

@dataclass
luokan piste:
x:int
y:int

def whereis(piste):
ottelupallo:
tapauskohta(0, 0):
tulosta ("Alkuperä")
tapauskohta(0, y):
tulosta (f"Y={y}")
tapauskohta(x, 0):
tulosta (f"X={x}")
tapauskohta():
tulosta ("Jossain muualla")
case_:
print ("Ei ole järkeä")

ottelupallo:
tapauskohta(x, y), jos x == y:
print(f"Y=X klo {x}")
tapauskohta(x, y):
print(f"Ei diagonaalissa")

PUNAINEN, VIHREÄ, SININEN = 0, 1, 2
vastaava väri:
kotelo .PUNAINEN:
tulosta ("Näen punaista!")
kotelo .GREEN:
print ("Ruoho on vihreää")
kotelo .BLU
E:
print("Minä tunnen bluesia :(")

Sarja on valmisteltu tarkistettavaksi laastareita kokeellisen kanssa toteutus ehdotettu spesifikaatio, mutta lopullinen versio on edelleen keskusteltu. Esimerkiksi tarjottu Käytä oletusarvona ilmaisun "case _:" sijaan avainsanaa "else:" tai "default:", koska "_" muissa yhteyksissä käytetään väliaikaisena muuttujana. Kyseenalainen on myös sisäinen organisaatio, joka perustuu uusien lausekkeiden kääntämiseen tavukoodiksi, joka on samankaltainen kuin "if ... elif ... else" -konstruktioissa, joka ei anna toivottua suorituskykyä erittäin suuria vertailusarjoja käsiteltäessä.

Lähde: opennet.ru

Lisää kommentti