Skaperne av Python-språket overveier et nytt forslag, PEP 622, som til slutt vil bringe en mønstermatchende uttalelsessyntaks til Python. De nye uttalelsene om mønstermatching vil gi Python-programmerere mer uttrykksfulle måter å håndtere strukturerte data på, uten å måtte ty til løsninger.
Mønstermatching er et vanlig trekk ved mange programmeringsspråk, for eksempel bryter / koffert
i C. Det gjør det mulig å utføre en av en rekke mulige handlinger basert på verdien av en gitt variabel eller et gitt uttrykk. Mens Python manglet en innfødt syntaks for mønstermatching, har det vært mulig å etterligne den medhvis / elif / annet
kjeder eller et ordbokoppslag.
PEP 622 foreslår en metode for å matche et uttrykk mot en rekke slags mønstre ved bruk av a kamp / sak
syntaks:
matche noe: sak 0 | 1 | 2: utskrift ("Lite antall") sak [] | [_]: print ("A short sequence") case str () | bytes (): print ("Something string-like") case _: print ("Noe annet")
Støttede mønsterkamptyper inkluderer bokstaver, navn, konstante verdier, sekvenser, en kartlegging (i utgangspunktet tilstedeværelsen av et nøkkelverdipar i uttrykket), en klasse, en blanding av ovennevnte eller noen av disse pluss betingede uttrykk. Eventuelle kamper som er tvetydige eller umulige å løse, kaster et unntak under kjøretiden.
Objekter kan håndtere samsvarstester ved hjelp av en ny protokoll kalt __kamp__
protokoll. Hvis et objekt implementerer __kamp__
metode, kan den brukes til å teste om den samsvarer med et gitt klassemønster og gi et passende svar.
PEP 622 vil også tillate statiske typekontrollere å kontrollere at fyrstikker kan verifiseres. En ny @ forseglet
dekoratør for en klasse indikerer for å skrive brikker at enhver underklasse for den aktuelle klassen er definert i samme modul som basisklassen.
Tidligere PEPer for å legge til mønstermatching - PEP 275 og PEP 3103, foreslått i henholdsvis 2001 og 2006 - ble avslått på grunn av mangel på populær støtte. PEP 3103 ble utarbeidet av Python-skaperen Guido van Rossum. Den nye PEP, forfattet av van Rossum og flere andre, har som mål å gi regelmessige uttrykk for objektmatching, i stedet for bare en enkel hvis / elif / annet
erstatning. Forfatterne bemerker at mange aspekter av denne PEP ble inspirert av hvordan mønstermatching fungerer i Rust og Scala.
Hvordan alt dette vil bli implementert under panseret, er fremdeles til diskusjon. Implementeringen foreslått i PEP 622 vil generere de samme bytekodesekvensene som en hvis / elif / annet
kjede. Større bryter / koffert
blokker kan bli mindre effektive, avhengig av hvor mye betinget logikk som er inkludert i hver sak
. Men PEP gjør det klart at et hvilket som helst antall tilnærminger og ytelsesoptimaliseringer (f.eks. Memoisering) fremdeles er på bordet.
Selv om PEP ender med å bli akseptert, kan mye om det endres. Et spørsmål som sannsynligvis vil bli utfordret er bruken av sak _:
i stedet for ellers:
som en siste fangst-klausul forbytte om
uttalelse._
brukes som en midlertidig variabel i mange sammenhenger, og å overstyre dens oppførsel ensidig kan være en avstengning for utviklere.