Python erhält möglicherweise eine Mustervergleichssyntax

Die Entwickler der Python-Sprache überlegen sich einen neuen Vorschlag, PEP 622, der Python endlich eine Syntax für Mustervergleichsanweisungen bringen soll. Die neuen Pattern Matching-Anweisungen würden Python-Programmierern eine aussagekräftigere Möglichkeit bieten, mit strukturierten Daten umzugehen, ohne auf Problemumgehungen zurückgreifen zu müssen. 

Der Mustervergleich ist ein gemeinsames Merkmal vieler Programmiersprachen, wie z. B. switch/casein C. Er ermöglicht das Ausführen einer von mehreren möglichen Aktionen basierend auf dem Wert einer bestimmten Variablen oder eines bestimmten Ausdrucks. Während Python keine native Syntax für den Mustervergleich hat, war es möglich, sie mit if/elif/elseKetten oder einer Wörterbuchsuche zu emulieren  .

PEP 622 schlägt ein Verfahren zum Abgleichen eines Ausdrucks mit einer Reihe von Arten von Mustern unter Verwendung einer match/caseSyntax vor:

etwas zusammenpassen: Fall 0 | 1 | 2: Fall ("Kleine Zahl") drucken [] | [_]: print ("Eine kurze Sequenz") case str () | bytes (): print ("Etwas String-ähnliches") case _: print ("Etwas anderes")

Unterstützte Musterübereinstimmungstypen umfassen Literale, Namen, konstante Werte, Sequenzen, eine Zuordnung (im Grunde das Vorhandensein eines Schlüssel-Wert-Paares im Ausdruck), eine Klasse, eine Mischung der oben genannten oder einen dieser plus bedingten Ausdrücke. Alle Übereinstimmungen, die nicht eindeutig oder nicht auflösbar sind, lösen zur Laufzeit eine Ausnahme aus.

Objekte können Übereinstimmungstests über ein neues Protokoll namens __match__Protokoll durchführen. Wenn ein Objekt die __match__Methode implementiert , kann es verwendet werden, um zu testen, ob es einem bestimmten Klassenmuster entspricht, und um eine entsprechende Antwort zurückzugeben.

Mit PEP 622 können auch statische Typprüfungen überprüfen, ob Übereinstimmungen überprüft werden können. Ein neuer @sealedDekorator für eine Klasse gibt den Typprüfern an, dass eine Unterklasse der betreffenden Klasse im selben Modul wie die Basisklasse definiert ist.

Frühere PEPs zur Hinzufügung von Pattern Matching - PEP 275 und PEP 3103, vorgeschlagen 2001 bzw. 2006 - wurden aufgrund mangelnder Unterstützung durch die Bevölkerung abgelehnt. PEP 3103 wurde vom Python-Schöpfer Guido van Rossum entworfen. Das neue PEP, das von van Rossum und mehreren anderen verfasst wurde, zielt darauf ab, reguläre Ausdrücke für den Objektabgleich bereitzustellen und nicht nur einen einfachen if/elif/else Ersatz. Die Autoren stellen fest, dass viele Aspekte dieses PEP davon inspiriert wurden, wie der Mustervergleich in Rust und Scala funktioniert. 

Wie dies alles unter der Haube umgesetzt werden würde, steht noch zur Diskussion. Die in PEP 622 vorgeschlagene Implementierung würde dieselben Bytecode-Sequenzen wie eine if/elif/elseKette erzeugen . Größere switch/caseBlöcke könnten weniger performant werden, je nachdem, wie viel bedingte Logik in jedem enthalten war case. Das PEP macht jedoch deutlich, dass noch eine Reihe von Ansätzen und Leistungsoptimierungen (z. B. Memoisierung) auf dem Tisch liegen.

Selbst wenn das PEP akzeptiert wird, kann sich viel daran ändern. Ein Problem, das wahrscheinlich in Frage gestellt wird, ist die Verwendung von case _: anstelle von else: als endgültige Sammelklausel für die  switch Erklärung. _ wird in vielen Kontexten als temporäre Variable verwendet, und das einseitige Überschreiben ihres Verhaltens kann für Entwickler eine Abneigung sein.