Vor Kurzem wurde die erste Beta Version (3.10.0b1) von Python 3.10 veröffentlicht. Ein Grund für uns sich die neuen Funktionen und Änderungen etwas genauer anzugucken. In diesem Blog-Artikel stellen wir euch, die aus unserer Sicht, zwei interessantesten Veränderungen der Programmiersprache vor.
Eine ausführliche Beschreibung der Veränderungen, im Vergleich zur Version 3.9, findet ihr auch auf der offiziellen Python Seite: https://docs.python.org/3.10/whatsnew/3.10.html
Structural Pattern Matching
Die wohl größte und gleichzeitig umstrittenste Änderung an der Programmiersprache Python bringt das sogenannte Structural Pattern Matching mit sich, welches einen Ausdruck mit vorgegebenen Mustern vergleicht und je nach Übereinstimmung einen anderen Programmcode ausführt. In seiner einfachsten Form gleicht diese Funktion, den aus anderen Programmiersprachen (z.B. C/C++, Java oder JavaScript) bekannten Switch/Case Anweisungen und wurde daher insbesondere von Programmierer*innen, die bereits eine andere Sprache gelernt haben, immer wieder vermisst.
In Python kommt hierfür das neue Schlüsselwort match zum Einsatz, welches den zu vergleichenden Ausdruck angibt. Anschließend werden die Muster mit dem Schlüsselwort case definiert. Wie bei anderen Kontrollstrukturen wird die einleitende Zeile mit einem Doppelpunkt abgeschlossen und die auszuführenden Programmzeilen eingerückt dargestellt.
zahl = 2
match zahl:
case 1:
print("Die Zahl ist 1")
case 2:
print("Die Zahl ist 2")
case _:
print("Die Zahl ist nicht 1 oder 2")
Case mit einem Unterstrich case _: , wird ausgeführt sofern keine andere Übereinstimmung gefunden wurde. Diese Option ist also vergleichbar mit dem else einer if-Bedingung.
Im vorliegenden Fall kommt schnell die Frage auf, warum man das Problem nicht auch genauso gut mit if-else-Bedingungen hätte lösen können. Betrachtet man jedoch die weiteren möglichen Funktionen des Structural Pattern Matching wird schnell deutlich, wie mächtig die Mustererkennung ist. Viele Problemstellungen lassen sich dadurch deutlich eleganter lösen. Gerade beim erkennen von Benutzereingaben (z.B. bei einem Chatbot oder in einem Text-Adventure) entstehen schnell komplexe und verschachtelte if/else-Bedingungen, welche mit den neuen Möglichkeiten durch das Structural Pattern Matching deutlich leichter gelöst werden könnten.
In einem offiziellen Tutorial zum Structural Pattern Matching (https://www.python.org/dev/peps/pep-0636/) werden viele dieser Anwendungsfälle mit Beispielen beschrieben. So können Benutzereingaben in einem Text-Adventure mehrere relevante Informationen beinhalten, z.B. "Was soll getan werden" und welche zusätzlich Information ist dafür nötig ("gehe nach Norden"). Genau eine solche Problemstellung wird in dem Tutorial anhand eines Beispiels verdeutlicht:
match command.split():
case ["go", ("north" | "south" | "east" | "west") as direction]:
current_room = current_room.neighbor(direction)
Sofern das erste Schlüsselwort "go" ist, kann das folgende Wort eins aus dem Tupel ("north" | "south" | "east" | "west") sein. Zusätzlich wird die Himmelsrichtung in der Variablen direction gespeichert und kann im folgenden Programmcode verwendet werden.
Weitere solcher Anwendungsfälle werden wir euch demnächst in einer Live Coding Session vorstellen und sobald die neue Python Version offiziell veröffentlicht wurde, natürlich auch in unsere Kurse integrieren.
Genauere Angaben zu Fehlern
Insbesondere für Einsteiger*innen ist es häufig schwierig die durch Python ausgegebenen Fehlermeldungen zu deuten und die Ursache des Fehlers zu finden. Viele der ausgebebenen Fehlermeldungen sind relativ allgemein formuliert und benötigen etwas Erfahrung in der Interpretation. Um Fehlermeldungen besser zu verstehen und die Ursache zu finden, gibt es in der kommenden Version viele kleine Verbesserungen.
In dem folgenden Beispiel fehlt z.B. die geschlossene Klammer der print-Funktion (Syntax Error).
print("Das ist eine Nachricht"
In der Version 3.9 wird hier nur die Meldung "SyntaxError: invalid syntax" ausgegeben und kennzeichnet den Fehler erst in der kommenden Zeile. Die Version 3.10 ist hier etwas genauer:
print("Das ist eine Nachricht"
^
SyntaxError: '(' was never closed
Wir bekommen in diesem Fall also mitgeteilt, dass es eine geöffnete Klammer gibt, die wir nicht geschlossen haben und auch um welche Klammer es sich genau handelt.
Aber auch andere Syntax Fehler werden nun genauer beschrieben, z.B.
Fehlender Doppelpunkt beim Erzeugen einer Kontrollstruktur.
Fehlende Kommas (z.B. bei Datenstrukturen).
Fehlende Doppelpunkte als Trennzeichen zwischen Key und Value (Werte) oder fehlende Werte bei einem Dictionary.
Nur ein Gleichheitszeichen bei einem Vergleich (z.B. bei einer Bedingung)
Ein weiterer Fehler der insbesondere als Anfänger*in häufiger auftritt, sind fehlerhafte Einrückungen z.B. bei Kontrollstrukturen (Indentation Error).
In den folgenden Beispielen ist der print()-Befehl nicht eingerückt und verursacht einen Indentation Error.
Version 3.9:
>>> if true:
print("Hallo")
SyntaxError: expected an indented block
Version 3.10:
>>> if true:
print("Hallo")
SyntaxError: expected an indented block after 'if' statement on line 1
In Version 3.10 bekommen wir eine viel genauere Information darüber, wo die Einrückung nicht korrekt ist.
Laut der verlinkenden Dokumentation zu Veränderungen in der kommenden Python Version sollen Tippfehler (Typos) bei Variablen oder Attributen (wenn möglich) erkannt werden und Vorschläge für die eigentliche gemeinte Variable ausgegeben werden. Leider konnten wir diese Funktion in der vorliegenden Beta Version noch nicht nachvollziehen.
Update (07.06.2021): Mit der Beta Version 3.10.0b2 funktioniert auch die Erkennung von Tippfehlern von Namen (NameErrors) und Attributen (AttributeErrors).
Die offizielle Version 3.10 soll am 4. Oktober 2021 erscheinen.
Comments