Lerne Coding
Pattern Matching in Python 3.10 - Erklärt!
13.10.2021

Pattern Matching in Python 3.10 eine Anleitung

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

In diesem Artikel wollen wir uns mit einer neuen Funktion in Python beschäftigen, die es seit Version 3.10 gibt. Diese Version ist erst am 4. Oktober 2021 herausgekommen, also noch ganz frisch. Durch Pattern Matching kann man Variablen mit vielen unterschiedlichen Werten vergleichen. Es ermöglicht eine syntaktisch einfachere Darstellung von if Statements. In unserem Fall, dass es auf sehr viele Werte geprüft wird, oder nur Teil-Werte verglichen werden. Zum Beispiel bei Koordinaten. In anderen Programmiersprachen wird das Pattern Matching auch häufig als Switch Case bezeichnet.

Wie sieht die Syntax für das Pattern Matching in Python aus?

In Python beginnt ein Pattern Matching mit einem match Block. Mit dem case Keyword kann man darin verschiedene Fälle (eng. case) erstellen.

Zu beachten ist, dass zum Beispiel kein default Case als Keyword vorhanden ist, wie bei vielen anderen Programmiersprachen. Dort wird auf ein Wildcard Pattern zurückgegriffen und als Wert wird ein _ eingesetzt. Diese Regel wird im falle, dass keine andere zutrifft, ausgeführt.

Das Pattern Matching in Python verhält sich etwas andere wie zum Beispiel in PHP. In Python wird sofort die Ausführung abgebrochen der nachfolgenden Cases, wenn ein Case zutrifft. In PHP zum Beispiel laufen standardmäßig alle Cases durch ohne Abbruch, wenn ein Case zutrifft. Um diese Verhalten in PHP dann zum Beispiel zu erhalten ist ein break; notwendig.

In dem folgenden Beispiel prüfen wir nun, ob eine Anweisung einen der erwarteten Rückgabewerte hat. Andernfalls gehen wir in das Wildcard Pattern und geben einen Fehlerfall zurück. Um nun keine Response, oder ähnliches, abfragen zu müssen, habe ich die Variable im Code definiert. In einer echten Anwendung würdest du den Wert zum Beispiel von einer API erhalten.

import random

def randomResponse():
    return random.randint(-5,10)

def checkResponse(responseNumber):

    match responseNumber: 
        case 2:
            print(f"Entspricht den Richtlinien ({responseNumber})!")
        case 4:
            print(f"Entspricht nicht den Richtlinien ({responseNumber})!")
        case 7 | 8 | 9:
            print(f"Entspricht einer gesonderten Richtlinie ({responseNumber})!")
        case responseNumber if responseNumber < 0:
            print(f"Wert ist zu klein ({responseNumber})!")
        case _:
            print(f"Nicht valide Eingabe  ({responseNumber})")

response = randomResponse()

checkResponse(response)

Neben dem Wildcard Matching (mit _ Unterstrich) kann man auch ein | als oder verwenden, um unterschiedliche Werte zu matchen.

Abgesehen von dem direkten Matching, kannst du auch das Ganze mit einer if Anweisung kombinieren, um wie in unserem Beispiel zu Prüfen, ob der Wert kleiner als 0 ist.

Ein Teil eines Tupels prüfen

Mit dem Pattern Matching kannst du nicht nur einfache Vergleiche machen, sondern auch einen Teil eins Tupels prüfen. Angenommen wir haben eine Funktion, die uns einen Tupel mit 3 Stellen zurückgibt. Zum Beispiel haben wir einen Tupel mit folgendem Inhalt: Statuscode, Titel und Beschreibung. Nun wollen wir von allen Elementen den Titel und Beschreibung haben, die uns den Statuscode 1 zurückgeben.

import random

def randomResponse():
    return random.randint(1,3)

def checkResponse(responseNumber):
    match responseNumber: 
        case [1,title,description]:
            print(f"Title {title}, Description: {description}")

response = randomResponse()

checkResponse((response,'Wichtiger Task','Das ist der wichtige Task'))

So kannst du nicht nur Teile von Tupeln prüfen sondern auch Listen, Klassen oder Dictionaries.

Der Vergleich zu einer Variante ohne Pattern Matching

Nun, da wir die Syntax kennengelernt haben, will ich euch noch einmal das Beispiel vom Anfang, gelöst über eine if-Anweisung zeigen, damit ihr die Vorteile von einem Pattern Matching noch etwas besser erkennen könnt.

import random

def randomResponse():
    return random.randint(-5,10)

def checkResponse(responseNumber):
    if responseNumber == 2:
        print(f"Entspricht den Richtlinien ({responseNumber})!")
    elif responseNumber == 4:
        print(f"Entspricht nicht den Richtlinien ({responseNumber})!")
    elif responseNumber in [7,8,9]:
        print(f"Entspricht einer gesonderten Richtlinie ({responseNumber})!")
    elif responseNumber < 0:
        print(f"Wert ist zu klein ({responseNumber})!")
    else:
        print(f"Nicht valide Eingabe  ({responseNumber})")

response = randomResponse()

checkResponse(response)

Du siehst es funktioniert auch ohne Pattern Matching. Allerdings hat die Schreibweise if responseNumber == 2 im Vergleich zu case 2 ein deutlicher Unterschied in der Länge bzw. von der Schreibarbeit.

Mehr zu den Vorteilen kannst du auch noch auf der offiziellen Python Seite unter der PEP 636 finden.

Fazit

In diesem Artikel haben wir uns das Pattern Matching in Python angeschaut. Vielleicht solltest du einmal prüfen, ob du auf die neue Version 3.10 von Python wechseln kannst. Falls das für dich der Fall ist, kannst du einmal deine if- Anweisungen prüfen, ob nicht ein Pattern Matching syntaktisch besser wäre.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Pattern Matching in Python 3.10 - Erklärt!"!

Kommentar schreiben

Verwante Beiträge
close