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.
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 Python. 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.
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.
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.
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.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Pattern Matching in Python 3.10 - Erklärt!"!