Python kan få mönstermatchande syntax

Skaparna av Python-språket funderar på ett nytt förslag, PEP 622, som äntligen skulle ge en mönstermatchande syntax för Python. De nya mönstermatchningsuttalandena skulle ge Python-programmerare mer uttrycksfulla sätt att hantera strukturerad data utan att behöva tillgripa lösningar. 

Mönstermatchning är ett vanligt inslag i många programmeringsspråk, till exempel switch/casei C. Det gör att en av ett antal möjliga åtgärder kan vidtas baserat på värdet på en given variabel eller uttryck. Medan Python saknat en infödd syntax för mönstermatchning har det varit möjligt att efterlikna den med  if/elif/elsekedjor eller en ordbokssökning.

PEP 622 föreslår en metod för att matcha ett uttryck mot ett antal typer av mönster med en match/casesyntax:

matcha något: fall 0 | 1 | 2: tryck ("Litet antal") fall [] | [_]: tryck ("En kort sekvens") fall str () | bytes (): print ("Something string-like") case _: print ("Something else")

Mönstermatchningstyper som stöds inkluderar bokstäver, namn, konstanta värden, sekvenser, en mappning (i princip närvaron av ett nyckel-värdepar i uttrycket), en klass, en blandning av ovanstående eller något av dessa plus villkorliga uttryck. Eventuella matchningar som är tvetydiga eller omöjliga att lösa ger ett undantag vid körning.

Objekt kan hantera matchningstester med hjälp av ett nytt protokoll som kallas __match__protokollet. Om ett objekt implementerar __match__metoden kan det användas för att testa om det matchar ett visst klassmönster och returnera ett lämpligt svar.

PEP 622 tillåter också kontroller av statisk typ att verifiera att matchningar kan verifieras. En ny @sealeddekoratör för en klass indikerar att typkontrollerar att varje underklass för den aktuella klassen definieras i samma modul som basklassen.

Tidigare PEP för att lägga till mönstermatchning - PEP 275 och PEP 3103, som föreslogs 2001 respektive 2006 - avvisades på grund av brist på populärt stöd. PEP 3103 ritades av Python-skaparen Guido van Rossum. Den nya PEP, författad av van Rossum och flera andra, syftar till att ge regelbundna uttryck för objektmatchning, snarare än bara en enkel if/elif/else ersättning. Författarna noterar att många aspekter av denna PEP inspirerades av hur mönstermatchning fungerar i Rust och Scala. 

Hur allt detta skulle genomföras under huven är fortfarande uppe till diskussion. Implementeringen som föreslås i PEP 622 skulle generera samma bytecode-sekvenser som en if/elif/elsekedja. Större switch/caseblock kan bli mindre prestanda beroende på hur mycket villkorlig logik som ingår i varje case. Men PEP gör det klart att ett antal tillvägagångssätt och prestandaoptimeringar (t.ex. memoisering) fortfarande finns på bordet.

Även om PEP slutar accepteras kan mycket om det förändras. En fråga som sannolikt kommer att ifrågasättas är användningen av case _: istället för else: som en slutgiltig klausul för  switch uttalandet. _ används som en tillfällig variabel i många sammanhang, och att åsidosätta dess beteende ensidigt kan vara en avstängning för utvecklare.