Blog
Python 3.10 führt eine bessere Fehlermeldung ein

Vor ein paar Wochen haben wir einen Blick auf den Mustervergleich in Python 3.10 geworfen. In diesem Blog gehen wir auf die verbesserten Fehlermeldungen ein.
Python 3.10 bringt einige wichtige Verbesserungen mit sich, die das Debuggen und Dokumentieren Ihres Codes vereinfachen werden. Als ich von diesen Verbesserungen hörte, habe ich zunächst die Vorabversionshinweise für Python 3.10 gelesen. Dort war ich angenehm überrascht von den Änderungen, die an einem alten Freund, dem SyntaxError, vorgenommen wurden. Als Programmieranfänger wurde ich oft von dieser Fehlermeldung begrüßt. Wenn man Google glauben darf, gibt es immer noch eine Menge Programmierer, die diese Meldung googeln.
Google-Trends-Daten zeigen, dass "Python Syntaxfehler" ein relevanter Suchbegriff bleibt
In früheren Versionen von Python wurden die meisten Syntaxfehler mit zweideutigen Meldungen wie 'SyntaxError: ungültige Syntax' und 'SyntaxError: unerwartetes EOF beim Parsen' angezeigt, die auf eine falsche Stelle verwiesen. Mit Python 3.10 wurden viele neue spezialisierte Fehlermeldungen eingeführt, um ein besseres Feedback zu geben. Werfen wir einen Blick auf diese verbesserten Fehlermeldungen.
Der nachstehende Code dient zur Auswahl von Städten mit einer hohen Bevölkerungszahl. Leider hat der Code mehrere Syntaxfehler.
def select_big_cities(city_population: Dict):
"""Select all cities with more than a million inhabitants and returns a list of tuples"""
return [city, pop for city, pop in city_population.items() if pop > 1000]
city_population = {'Amsterdam': 821, 'Brussels': 174, 'Stockholm': 975,
'London': 8982, 'New York': 8419, 'Paris': 2161
big_city_population = select_big_cities(city_population)
In Python 3.9 schlägt dieser Code fehl mit:
File "blog_39/blog.py", line 8
return [city, pop for city, pop in city_population.items() if pop > 1000]
^
SyntaxError: invalid syntax
Wir erhalten die bekannte Meldung "SyntaxError: ungültige Syntax" und werden in der Fehlermeldung auf das Schlüsselwort "for" hingewiesen. Das hilft uns nicht wirklich, den Fehler in unserem Code zu verstehen. Habe ich eines der Schlüsselwörter falsch geschrieben? oder sollte meine Bedingung früher in dieser Anweisung stehen? In Python 3.10 resultiert dieser Code in:
File "blog_310/blog.py", line 8
return [city, pop for city, pop in city_population.items() if pop > 1000]
^^^^^^^^^
SyntaxError: did you forget parentheses around the comprehension target?
In diesem Fall erhalten wir eine eindeutige Fehlermeldung über das Hinzufügen von Klammern um das Verstehensziel. Die Fehlermeldung verweist uns auch auf die Stelle in der List Comprehension, an der der Fehler aufgetreten ist. So können wir den Code leichter korrigieren. Jetzt, wo der Fehler behoben ist, beschwert sich Python 3.9 über:
File "blog_39/blog.py", line 14
big_city_population = select_big_cities(city_population)
^
SyntaxError: invalid syntax
Während Python 3.10, vorschlagen:
File "blog_310/blog.py", line 14
city_population = {'Amsterdam': 821, 'Brussels': 174, 'Stockholm': 975,
^
SyntaxError: '{' was never closed
Das nenne ich mal eine Zeitersparnis! Wir haben vergessen, die geschweiften Klammern zu schließen, als wir das Wörterbuch definiert haben, und der Stack-Trace zeigt sogar auf die Klammer, die nicht geschlossen wurde.
Ein anderes Beispiel wäre, wenn wir eines der Kommas in der Wörterbuchdefinition entfernen würden. Etwa so:
city_population = {'Amsterdam': 821, 'Brussels': 174, 'Stockholm': 975,
'London': 8982, 'New York': 8419 'Paris': 2161}
In Python 3.9 führt dies zu:
File "blog_39/blog.py", line 12
'London': 8982, 'New York': 8419 'Paris': 2161}
^
SyntaxError: invalid syntax
In Python 3.10 führt dies zu:
File "blog_310/blog.py", line 12
'London': 8982, 'New York': 8419 'Paris': 2161}
^^^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Python 3.10 vermerkt - in exquisiter britischer Manier - dass wir PERHAPS ein Komma vergessen haben. Und genau das haben wir getan. Python hebt sogar die beiden Elemente hervor, zwischen die das Komma gesetzt werden sollte.
Einige andere bemerkenswerte spezialisierte Syntax-Fehlermeldungen beziehen sich auf:
- Fehlendes ":" vor eingerückten Blöcken
- Verwendung von "=" anstelle von "==" in Vergleichen
- Mehrere Ausnahmetypen in der except-Anweisung ohne Klammern
- "try" Blöcke ohne "except" oder "finally" Blöcke
Die neuen spezialisierten Syntax-Fehlermeldungen können uns eindeutig dabei helfen, unsere Syntaxfehler schnell zu finden und zu beheben, aber dies sind nicht die einzigen verbesserten Fehlermeldungen in der Python 3.10 Version.
Einrückungsfehler werden mit mehr Kontext verbessert, einschließlich der Stelle, an der die Einrückung falsch ist.
AttributeErrors bietet Vorschläge, wenn Sie ein Attribut falsch schreiben. Dies geschieht z.B., indem es die ähnlichen Attribute in dem Objekt betrachtet, von dem der AttributeError ausgelöst wurde:
class Math:
sqrt = 0
squirrel = "squirrel"
m = Math()
m.sqrr
File "<stdin>", line 1, in <module>
m.sqrr
AttributeError: module 'Math' has no attribute 'sqrr'. Did you mean: 'sqrt'?
Eigentlich wollten wir das Attribut Eichhörnchen verwenden. Aber das zeigt uns, wie diese neuen hilfreichen Nachrichten uns das am ähnlichsten benannte Attribut liefern.
Schließlich bieten NameErrors auch Vorschläge für ähnliche Variablennamen. Zum Beispiel:
List_of_numbers = [1, 2, 3, 4, 5]
List_of_numburs.remove(5)
File "<stdin>", line 1, in <module>
List_of_numburs.remove(5)
NameError: name 'List_of_numburs' is not defined. Did you mean: 'List_of_numbers'?
Hinweis: Die Verbesserungen für Attribut- und Namensfehler funktionieren in bestimmten REPLs (z.B. IPython) nicht, weil sie PyErr_Display() nicht aufrufen, um den Fehler anzuzeigen.
Fazit
Python 3.10 verbessert die Ergonomie bei der Verwendung der Sprache erheblich und wir können es kaum erwarten, dass sie tatsächlich veröffentlicht wird. Wenn Sie mehr über diese und andere Änderungen an Python in Version 3.10 erfahren möchten, empfehle ich Ihnen die Lektüre der Prerelease Notes und der begleitenden PEPs.
Verfasst von
Herbert van Leeuwen
Unsere Ideen
Weitere Blogs
Contact



