Programmiersprache: Python 3.10 führt das Pattern Matching ein

Neben spezifischeren Typhinweisen und aussagekräftigeren Fehlermeldungen ist Pattern Matching die wichtigste Neuerung im jetzt veröffentlichten Release.

In Pocket speichern vorlesen Druckansicht 109 Kommentare lesen
Python
Lesezeit: 3 Min.
Von
  • Matthias Parbel

Mit der Freigabe von Python 3.10 erwartet Entwicklerinnen und Entwickler eine umfassende Syntaxerweiterung: das Pattern Matching. Das neueste Release der Programmiersprache hat aber noch eine ganze Reihe weiterer Neuigkeiten und Verbesserungen im Gepäck, darunter hilfreichere und aussagekräftigere Fehlermeldungen für das Debugging, spezifischere und leichter lesbare Typhinweise sowie neue Funktionen zur Berechnung multivariabler Statistik.

Nachdem die Programmiersprache am 20. Februar 2021 offiziell ihr 30-jähriges Jubiläum feiern durfte, hat das Entwicklerteam nun mit Python 3.10 eine neue Version vorgelegt, die umfangreiche Neuerungen bringt. Die Möglichkeiten zum strukturellen Musterabgleich (PEP 634: Structural Pattern Matching) dürften vorwiegend all jenen zugutekommen, die sich intensiv mit Datenstrukturen auseinandersetzen.

Für das Pattern Matching wurde die Syntax um die beiden Anweisungen match und case erweitert, über die sich nun Informationen aus komplexen Datentypen extrahieren, die Struktur von Daten verzweigen oder andere spezifische Aktionen auf unterschiedlichste Datenformen anwenden lassen. Muster für einen Abgleich können dabei aus Sequenzen (Listen, Tupel etc.), Mapping-Strukturen (z.B. Wörterbücher), primitiven Datentypen oder Klasseninstanzen bestehen. Eine match-Anweisung nimmt einen Ausdruck und vergleicht dessen Wert mit aufeinanderfolgenden Mustern, die als Fallblöcke angegeben sind. Das folgende Listing zeigt exemplarisch ein Muster mit einem Literal und einer Variablen:

# point is an (x, y) tuple
match point:
    case (0, 0):
        print("Origin")
    case (0, y):
        print(f"Y={y}")
    case (x, 0):
        print(f"X={x}")
    case (x, y):
        print(f"X={x}, Y={y}")
    case _:
        raise ValueError("Not a point")

Während Python gemeinhin als einfach zu erlernende und zu handhabende Programmiersprache gilt, hat das Entwicklerteam in puncto Debugging noch Verbesserungspotenzial ausgemacht und bei der Verständlichkeit von Fehlermeldungen nachgebessert. Bereits beim Parsen des Codes soll der Interpreter nun präzisere und hilfreichere Hinweise liefern. In bisherigen Python-Versionen mussten sich Entwicklerinnen und Entwickler angesichts wenig aussagekräftiger Fehlermeldungen wie SyntaxError: unexpected EOF while parsing selbst auf die Suche nach ungeschlossenen Klammern, fehlenden Doppelpunkten oder Kommata machen. Ab Version 3.10 gibt der Interpreter in solchen Fällen konkrete SyntaxError-Hinweise auf die für den Fehler relevante Position im Code – wie etwa die fehlende schließende geschweifte Klammer im folgenden Beispiel:

File "example.py", line 1
    expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               ^
SyntaxError: '{' was never closed

Weitere wichtige Neuerungen im Python-Release betreffen das statische Typensystem. Um Code zu vereinfachen, ohne Typinformationen zu verlieren, lassen sich ab Python 3.10, wie in PEP 604 vorgeschlagen, nun Union[float, int] durch das spezifischere float | int ersetzen. Beim Type Hinting lässt sich darüber hinaus list anstelle der in Python 3.9 eingeführten typing.List verwenden. Dadurch vereinfacht sich ein Codeabschnitt wie

from typing import List, Union

def mean(numbers: List[Union[float, int]]) -> float:
    return sum(numbers) / len(numbers)

zu

def mean(numbers: list[float | int]) -> float:
    return sum(numbers) / len(numbers)

In diesem Code ist nicht nur die Annotation zu numbers leichter zu lesen, sondern auch kein Import aus typing erforderlich.

Einen detaillierten Überblick zu sämtlichen Neuerungen bieten der Python-Insider-Blog sowie die Dokumentation zu Python 3.10. Das neue Release der Programmiersprache steht ab sofort zum Download bereit.

(map)