Ungültige Syntax in Python: Häufige Gründe für SyntaxError

Ungültige Syntax in Python: Häufige Gründe für SyntaxError

Python ist bekannt für seine einfache Syntax. Wenn Sie jedoch Python zum ersten Mal lernen oder wenn Sie mit einem soliden Hintergrund in einer anderen Programmiersprache zu Python kommen, stoßen Sie möglicherweise auf einige Dinge, die Python nicht zulässt. Wenn Sie beim Versuch, Ihren Python-Code auszuführen, jemals einen + SyntaxError + erhalten haben, kann Ihnen dieses Handbuch helfen. In diesem Lernprogramm werden allgemeine Beispiele für ungültige Syntax in Python angezeigt und erfahren, wie Sie das Problem beheben können.

*Am Ende dieses Tutorials können Sie:*
 *Identifizieren Sie* ungültige Syntax * in Python
 *Machen Sie Sinn aus* `+ SyntaxError +` * Tracebacks
* *Auflösen* ungültige Syntax oder ganz verhindern
*Kostenloser Bonus:* Link: [5 Gedanken zur Python-Meisterschaft], ein kostenloser Kurs für Python-Entwickler, der Ihnen die Roadmap und die Denkweise zeigt, die Sie benötigen, um Ihre Python-Fähigkeiten auf die nächste Stufe zu bringen.

Ungültige Syntax in Python

Wenn Sie Ihren Python-Code ausführen, analysiert der Interpreter ihn zuerst, um ihn in Python-Bytecode zu konvertieren, den er dann ausführt. Der Interpreter findet in dieser ersten Phase der Programmausführung, auch als Parsing-Phase bezeichnet, eine ungültige Syntax in Python. Wenn der Interpreter Ihren Python-Code nicht erfolgreich analysieren kann, bedeutet dies, dass Sie irgendwo in Ihrem Code eine ungültige Syntax verwendet haben. Der Interpreter versucht Ihnen anzuzeigen, wo dieser Fehler aufgetreten ist.

Wenn Sie Python zum ersten Mal lernen, kann es frustrierend sein, einen "+ SyntaxError +" zu erhalten. Python wird versuchen, Ihnen dabei zu helfen, festzustellen, wo sich die ungültige Syntax in Ihrem Code befindet, aber das traceback, das es bereitstellt, kann etwas verwirrend sein. Manchmal ist der Code, auf den es zeigt, vollkommen in Ordnung.

*Hinweis:* Wenn Ihr Code *syntaktisch* korrekt ist, werden möglicherweise andere Ausnahmen ausgelöst, die kein `+ SyntaxError +` sind. Weitere Informationen zu den anderen Ausnahmen von Python und deren Behandlung finden Sie unter https://realpython.com/python-exceptions/[Python Exceptions: An Introduction].

Sie können ungültige Syntax in Python nicht wie andere Ausnahmen behandeln. Selbst wenn Sie versucht haben, einen + try + und` + außer + Block um Code mit ungültiger Syntax zu wickeln, wird der Interpreter immer noch einen + SyntaxError + `auslösen.

+ SyntaxError + Ausnahme und Traceback

Wenn der Interpreter im Python-Code auf eine ungültige Syntax stößt, wird eine + SyntaxError + -Ausnahme ausgelöst und ein Traceback mit einigen hilfreichen Informationen bereitgestellt, die Ihnen beim Debuggen des Fehlers helfen. Hier ist ein Code, der eine ungültige Syntax in Python enthält:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael"]} years old.')

Sie können die ungültige Syntax im Wörterbuchliteral in Zeile 4 sehen. Dem zweiten Eintrag, "" Jim "", fehlt ein Komma. Wenn Sie versucht haben, diesen Code unverändert auszuführen, erhalten Sie den folgenden Traceback:

$ python theofficefacts.py
File "theofficefacts.py", line 5
    'michael': 43
            ^
SyntaxError: invalid syntax

Beachten Sie, dass die Traceback-Nachricht den Fehler in Zeile 5 und nicht in Zeile 4 findet. Der Python-Interpreter versucht herauszufinden, wo sich die ungültige Syntax befindet. Es kann jedoch nur wirklich darauf hinweisen, wo es zuerst ein Problem bemerkt hat. Wenn Sie einen "+ SyntaxError +" - Traceback erhalten und der Code, auf den der Traceback zeigt, gut aussieht, möchten Sie den Code rückwärts durchlaufen, bis Sie feststellen können, was falsch ist.

Im obigen Beispiel gibt es kein Problem damit, ein Komma wegzulassen, je nachdem, was danach kommt. Zum Beispiel gibt es kein Problem mit einem fehlenden Komma nach "" michael "" in Zeile 5. Sobald der Dolmetscher jedoch auf etwas stößt, das keinen Sinn ergibt, kann er Sie nur auf das erste hinweisen, was er nicht verstehen konnte.

*Hinweis:* In diesem Tutorial wird davon ausgegangen, dass Sie die Grundlagen der *Tracebacks* von Python kennen. Weitere Informationen zum Python-Traceback und zum Lesen finden Sie unter https://realpython.com/python-traceback/[Verstehen des Python-Tracebacks].

Es gibt einige Elemente eines Traceback "+ SyntaxError +", mit denen Sie feststellen können, wo sich die ungültige Syntax in Ihrem Code befindet:

  • Der Dateiname , bei dem die ungültige Syntax festgestellt wurde

  • Die Zeilennummer und die reproduzierte Codezeile, in der das Problem aufgetreten ist

  • Ein Caret (+ ^ +) in der Zeile unter dem reproduzierten Code, das Ihnen den Punkt im Code anzeigt, an dem ein Problem auftritt

  • Die Fehlermeldung nach dem Ausnahmetyp + SyntaxError +, die Informationen zur Ermittlung des Problems enthalten kann

Im obigen Beispiel war der angegebene Dateiname "+ theofficefacts.py ", die Zeilennummer war 5, und das Caret zeigte auf das abschließende Zitat des Wörterbuchschlüssels " michael ". Der Traceback " SyntaxError +" weist möglicherweise nicht auf das eigentliche Problem hin, zeigt jedoch auf die erste Stelle, an der der Interpreter die Syntax nicht verstehen konnte.

Es gibt zwei weitere Ausnahmen, bei denen Python möglicherweise ausgelöst wird. Diese entsprechen + SyntaxError +, haben aber unterschiedliche Namen:

  1. + IndentationError +

  2. + TabError +

Diese Ausnahmen erben beide von der Klasse "+ SyntaxError ", sind jedoch Sonderfälle, wenn es um Einrückungen geht. Ein " IndentationError " wird ausgelöst, wenn die Einrückungsstufen Ihres Codes nicht übereinstimmen. Ein ` TabError +` wird ausgelöst, wenn Ihr Code sowohl Tabulatoren als auch Leerzeichen in derselben Datei verwendet. Sie werden sich diese Ausnahmen in einem späteren Abschnitt genauer ansehen.

Häufige Syntaxprobleme

Wenn Sie zum ersten Mal auf einen "+ SyntaxError " stoßen, ist es hilfreich zu wissen, warum ein Problem aufgetreten ist und wie Sie die ungültige Syntax in Ihrem Python-Code beheben können. In den folgenden Abschnitten sehen Sie einige der häufigsten Gründe, warum ein " SyntaxError +" ausgelöst werden könnte, und wie Sie diese beheben können.

Missbrauch des Zuweisungsoperators (+ = +)

In Python gibt es mehrere Fälle, in denen Sie keine Zuordnungen zu Objekten vornehmen können. Einige Beispiele weisen Literalen und Funktionsaufrufen zu. Im folgenden Codeblock sehen Sie einige Beispiele, die dies versuchen, und die daraus resultierenden + SyntaxError + Tracebacks:

>>>

>>> len('hello') = 5
  File "<stdin>", line 1
SyntaxError: can't assign to function call

>>> 'foo' = 1
  File "<stdin>", line 1
SyntaxError: can't assign to literal

>>> 1 = 'foo'
  File "<stdin>", line 1
SyntaxError: can't assign to literal

Das erste Beispiel versucht, dem Aufruf + len () + den Wert + 5 + zuzuweisen. Die Nachricht + SyntaxError + ist in diesem Fall sehr hilfreich. Hier erfahren Sie, dass Sie einem Funktionsaufruf keinen Wert zuweisen können.

Das zweite und dritte Beispiel versuchen, Literalen eine Zeichenfolge und eine Ganzzahl zuzuweisen. Die gleiche Regel gilt für andere Literalwerte. Die Traceback-Meldungen weisen erneut darauf hin, dass das Problem auftritt, wenn Sie versuchen, einem Literal einen Wert zuzuweisen.

*Hinweis:* In den obigen Beispielen fehlen die wiederholte Codezeile und das Caret (`+ ^ +`), die auf das Problem im Traceback hinweisen. Die Ausnahme und das Traceback, die Sie sehen, unterscheiden sich, wenn Sie sich in der REPL befinden, und versuchen, diesen Code aus einer Datei auszuführen. Wenn sich dieser Code in einer Datei befindet, erhalten Sie die wiederholte Codezeile und das Caret, die auf das Problem hinweisen, wie Sie in anderen Fällen in diesem Lernprogramm gesehen haben.

Es ist wahrscheinlich, dass Sie nicht beabsichtigen, einem Literal oder einem Funktionsaufruf einen Wert zuzuweisen. Dies kann beispielsweise auftreten, wenn Sie versehentlich das zusätzliche Gleichheitszeichen (+ = +) weglassen, wodurch die Zuordnung in einen Vergleich umgewandelt wird. Ein Vergleich, wie Sie unten sehen können, wäre gültig:

>>>

>>> len('hello') == 5
True

Wenn Python Ihnen in den meisten Fällen mitteilt, dass Sie eine Zuweisung für etwas vornehmen, das nicht zugewiesen werden kann, sollten Sie zunächst überprüfen, ob die Anweisung kein boolescher Ausdruck sein soll. Dieses Problem kann auch auftreten, wenn Sie versuchen, einem Python-Schlüsselwort einen Wert zuzuweisen, den Sie im nächsten Abschnitt behandeln werden.

Rechtschreibfehler, fehlende oder missbräuchliche Verwendung von Python-Schlüsselwörtern

Python-Schlüsselwörter sind eine Reihe von geschützten Wörtern , die in Python eine besondere Bedeutung haben. Dies sind Wörter, die Sie nicht als Bezeichner, Variablen oder Funktionsnamen in Ihrem Code verwenden können. Sie sind Teil der Sprache und können nur in dem Kontext verwendet werden, den Python zulässt.

Es gibt drei gängige Methoden, mit denen Sie fälschlicherweise Schlüsselwörter verwenden können:

  1. Rechtschreibfehler ein Schlüsselwort

  2. Fehlendes Schlüsselwort

  3. Missbrauch eines Schlüsselworts

Wenn Sie ein Schlüsselwort in Ihrem Python-Code falsch schreiben , erhalten Sie einen "+ SyntaxError ". Folgendes passiert beispielsweise, wenn Sie das Schlüsselwort " für +" falsch buchstabieren:

>>>

>>> fro i in range(10):
  File "<stdin>", line 1
    fro i in range(10):
        ^
SyntaxError: invalid syntax

Die Nachricht lautet "+ SyntaxError: ungültige Syntax +", aber das ist nicht sehr hilfreich. Der Traceback zeigt auf die erste Stelle, an der Python feststellen konnte, dass etwas nicht stimmte. Um diese Art von Fehler zu beheben, stellen Sie sicher, dass alle Ihre Python-Schlüsselwörter richtig geschrieben sind.

Ein weiteres häufiges Problem bei Schlüsselwörtern ist, wenn Sie sie insgesamt vermissen :

>>>

>>> for i range(10):
  File "<stdin>", line 1
    for i range(10):
              ^
SyntaxError: invalid syntax

Auch hier ist die Ausnahmemeldung nicht so hilfreich, aber der Traceback versucht, Sie in die richtige Richtung zu weisen. Wenn Sie vom Caret zurückkehren, können Sie sehen, dass das Schlüsselwort + in + in der Schleifensyntax + for + fehlt.

Sie können auch ein geschütztes Python-Schlüsselwort missbrauchen . Denken Sie daran, dass Schlüsselwörter nur in bestimmten Situationen verwendet werden dürfen. Wenn Sie sie falsch verwenden, enthält Ihr Python-Code eine ungültige Syntax. Ein häufiges Beispiel hierfür ist die Verwendung von https://realpython.com/python-for-loop/#the-break-and-continue-statements [+ continue + oder + break +] außerhalb einer Schleife. Dies kann während der Entwicklung leicht passieren, wenn Sie Dinge implementieren und die Logik außerhalb einer Schleife verschieben:

>>>

>>> names = ['pam', 'jim', 'michael']
>>> if 'jim' in names:
...     print('jim found')
...     break
...
  File "<stdin>", line 3
SyntaxError: 'break' outside loop

>>> if 'jim' in names:
...     print('jim found')
...     continue
...
  File "<stdin>", line 3
SyntaxError: 'continue' not properly in loop

Hier kann Python Ihnen genau sagen, was falsch ist. Die Meldungen "" "brechen" außerhalb der Schleife "" und "" "setzen" nicht richtig in der Schleife "" helfen Ihnen dabei, genau herauszufinden, was zu tun ist. Wenn dieser Code in einer Datei enthalten wäre, würde Python das Caret auch direkt auf das missbrauchte Schlüsselwort verweisen lassen.

Ein anderes Beispiel ist, wenn Sie versuchen, einer Variablen ein Python-Schlüsselwort zuzuweisen oder ein Schlüsselwort zum Definieren einer Funktion zu verwenden:

>>>

>>> pass = True
  File "<stdin>", line 1
    pass = True
         ^
SyntaxError: invalid syntax

>>> def pass():
  File "<stdin>", line 1
    def pass():
           ^
SyntaxError: invalid syntax

Wenn Sie versuchen, + pass + einen Wert zuzuweisen, oder wenn Sie versuchen, eine neue Funktion mit dem Namen + pass + zu definieren, erhalten Sie ein ` + SyntaxError + und sehen Sie die Meldung + "ungültige Syntax" + `erneut.

Es könnte etwas schwieriger sein, diese Art von ungültiger Syntax in Python-Code zu lösen, da der Code von außen gut aussieht. Wenn Ihr Code gut aussieht, Sie aber immer noch einen "+ SyntaxError +" erhalten, können Sie den zu verwendenden Variablennamen oder Funktionsnamen anhand der Keyword-Liste für die von Ihnen verwendete Python-Version überprüfen.

Die Liste der geschützten Schlüsselwörter hat sich mit jeder neuen Version von Python geändert. In Python 3.6 könnten Sie beispielsweise "+ warte " als Variablennamen oder Funktionsnamen verwenden, aber ab Python 3.7 wurde dieses Wort zur Schlüsselwortliste hinzugefügt. Wenn Sie nun versuchen, " await " als Variablen- oder Funktionsnamen zu verwenden, führt dies zu einem " SyntaxError +", wenn Ihr Code für Python 3.7 oder höher ist.

Ein weiteres Beispiel hierfür ist + print +, das sich in Python 2 von Python 3 unterscheidet:

Version print Type Takes A Value

Python 2

keyword

no

Python 3

built-in function

yes

+ print + ist ein Schlüsselwort in Python 2, daher können Sie ihm keinen Wert zuweisen. In Python 3 ist es jedoch eine integrierte Funktion, der Werte zugewiesen werden können.

Sie können den folgenden Code ausführen, um die Liste der Schlüsselwörter in der von Ihnen ausgeführten Python-Version anzuzeigen:

import keyword
print(keyword.kwlist)

+ keyword + bietet auch das nützliche + keyword.iskeyword () +. Wenn Sie nur einen schnellen Weg benötigen, um die Variable "+ pass +" zu überprüfen, können Sie den folgenden Einzeiler verwenden:

>>>

>>> import keyword; keyword.iskeyword('pass')
True

Dieser Code zeigt Ihnen schnell an, ob die Kennung, die Sie verwenden möchten, ein Schlüsselwort ist oder nicht.

Fehlende Klammern, Klammern und Anführungszeichen

Die Ursache für eine ungültige Syntax im Python-Code ist häufig eine fehlende oder nicht übereinstimmende schließende Klammer, Klammer oder ein Anführungszeichen. Diese können in sehr langen Zeilen verschachtelter Klammern oder längeren mehrzeiligen Blöcken schwer zu erkennen sein. Mithilfe von Pythons Tracebacks können Sie nicht übereinstimmende oder fehlende Anführungszeichen erkennen:

>>>

>>> message = 'don't'
  File "<stdin>", line 1
    message = 'don't'
                   ^
SyntaxError: invalid syntax

Hier zeigt der Traceback auf den ungültigen Code, in dem nach einem abschließenden einfachen Anführungszeichen ein "+ t" + "steht. Um dies zu beheben, können Sie eine von zwei Änderungen vornehmen:

  1. Entkomme dem einfachen Anführungszeichen mit einem Backslash (+ 'don \' t '+)

  2. Umgeben Sie stattdessen die gesamte Zeichenfolge in doppelte Anführungszeichen (" nicht ")

Ein weiterer häufiger Fehler ist, das Schließen der Zeichenfolge zu vergessen. Bei Zeichenfolgen in doppelten und einfachen Anführungszeichen sind Situation und Rückverfolgung gleich:

>>>

>>> message = "This is an unclosed string
  File "<stdin>", line 1
    message = "This is an unclosed string
                                        ^
SyntaxError: EOL while scanning string literal

Dieses Mal zeigt das Caret im Traceback direkt auf den Problemcode. Die Meldung "+ SyntaxError ", "" EOL beim Scannen des Zeichenfolgenliteral "", ist etwas spezifischer und hilfreich bei der Ermittlung des Problems. Dies bedeutet, dass der Python-Interpreter das Ende einer Zeile (EOL) erreicht hat, bevor eine offene Zeichenfolge geschlossen wurde. Um dies zu beheben, schließen Sie die Zeichenfolge mit einem Anführungszeichen, das dem entspricht, mit dem Sie sie gestartet haben. In diesem Fall wäre das ein doppeltes Anführungszeichen (`" + `).

Anführungszeichen, die in Anweisungen in einem f-string fehlen, können auch zu einer ungültigen Syntax in Python führen:

 1 # theofficefacts.py
 2 ages = {
 3     'pam': 24,
 4     'jim': 24,
 5     'michael': 43
 6 }
 7 print(f'Michael is {ages["michael]} years old.')

Hier fehlt dem Verweis auf das Wörterbuch + age + in der gedruckten F-Zeichenfolge das abschließende doppelte Anführungszeichen in der Schlüsselreferenz. Der resultierende Traceback lautet wie folgt:

$ python theofficefacts.py
  File "theofficefacts.py", line 7
    print(f'Michael is {ages["michael]} years old.')
         ^
SyntaxError: f-string: unterminated string

Python identifiziert das Problem und teilt Ihnen mit, dass es in der F-Zeichenfolge vorhanden ist. Die Meldung "" nicht abgeschlossene Zeichenfolge "" zeigt auch das Problem an. Das Caret zeigt in diesem Fall nur auf den Anfang der F-Saite.

Dies ist möglicherweise nicht so hilfreich, als wenn das Caret auf den Problembereich der F-Saite zeigt, aber es schränkt ein, wo Sie suchen müssen. Irgendwo in dieser F-Saite befindet sich eine nicht abgeschlossene Zeichenfolge. Sie müssen nur herausfinden, wo. Stellen Sie zur Behebung dieses Problems sicher, dass alle internen Anführungszeichen und Klammern für F-Zeichenfolgen vorhanden sind.

Bei fehlenden Klammern und Klammern ist die Situation meistens dieselbe. Wenn Sie beispielsweise die schließende eckige Klammer aus einer Liste weglassen, erkennt Python dies und weist darauf hin. Es gibt jedoch einige Variationen davon. Die erste besteht darin, die schließende Klammer von der Liste zu streichen:

# missing.py
def foo():
    return [1, 2, 3

print(foo())

Wenn Sie diesen Code ausführen, wird Ihnen mitgeteilt, dass beim Aufruf von "+ print () +" ein Problem vorliegt:

$ python missing.py
  File "missing.py", line 5
    print(foo())
        ^
SyntaxError: invalid syntax

Was hier passiert ist, dass Python glaubt, dass die Liste drei Elemente enthält: "+ 1 ", " 2 " und "+3 print (foo ()) +". Python verwendet https://realpython.com/lessons/whitespace-expressions-and-statements/[whitespace], um Dinge logisch zu gruppieren, und weil es kein Komma oder eine Klammer gibt, die ` 3 ` von ` print (foo ()) trennt. + `, Python fasst sie als drittes Element der Liste zusammen.

Eine andere Variante besteht darin, nach dem letzten Element in der Liste ein nachfolgendes Komma einzufügen, ohne die schließende eckige Klammer zu verwenden:

# missing.py
def foo():
    return [1, 2, 3,

print(foo())

Jetzt erhalten Sie einen anderen Traceback:

$ python missing.py
  File "missing.py", line 6

                ^
SyntaxError: unexpected EOF while parsing

Im vorherigen Beispiel wurden "+ 3 " und " print (foo ()) " als ein Element zusammengefasst, aber hier sehen Sie ein Komma, das die beiden trennt. Jetzt wird der Aufruf von ` print (foo ()) +` als viertes Element der Liste hinzugefügt, und Python erreicht das Ende der Datei ohne die schließende Klammer. Der Traceback zeigt an, dass Python das Ende der Datei (EOF) erreicht hat, aber etwas anderes erwartet hat.

In diesem Beispiel hatte Python eine schließende Klammer (+] +) erwartet, aber die wiederholte Zeile und das Caret sind nicht sehr hilfreich. Fehlende Klammern und Klammern sind für Python schwer zu identifizieren. Manchmal können Sie nur vom Caret ausgehen und sich rückwärts bewegen, bis Sie feststellen können, was fehlt oder was falsch ist.

Fehlerhafte Wörterbuchsyntax

Sie haben den Link: # syntaxerror-exception-and-traceback [früher] gesehen, dass Sie einen + SyntaxError + erhalten könnten, wenn Sie das Komma eines Wörterbuchelements weglassen. Eine andere Form der ungültigen Syntax bei Python-Wörterbüchern ist die Verwendung des Gleichheitszeichens (+ = +) zum Trennen von Schlüsseln und Werten anstelle des Doppelpunkts:

>>>

>>> ages = {'pam'=24}
  File "<stdin>", line 1
    ages = {'pam'=24}
                 ^
SyntaxError: invalid syntax

Auch diese Fehlermeldung ist nicht sehr hilfreich. Die wiederholte Zeile und das Caret sind jedoch sehr hilfreich! Sie zeigen direkt auf den Problemcharakter.

Diese Art von Problem tritt häufig auf, wenn Sie die Python-Syntax mit der anderer Programmiersprachen verwechseln. Dies wird auch angezeigt, wenn Sie das Definieren eines Wörterbuchs mit einem Aufruf von "+ dict () " verwechseln. Um dies zu beheben, können Sie das Gleichheitszeichen durch einen Doppelpunkt ersetzen. Sie können auch zu ` dict () +` wechseln:

>>>

>>> ages = dict(pam=24)
>>> ages
{'pam': 24}

Sie können + dict () + verwenden, um das Wörterbuch zu definieren, wenn diese Syntax hilfreicher ist.

Verwenden der falschen Einrückung

Es gibt zwei Unterklassen von "+ SyntaxError +", die sich speziell mit Einrückungsproblemen befassen:

  1. + IndentationError +

  2. + TabError +

Während andere Programmiersprachen geschweifte Klammern verwenden, um Codeblöcke zu kennzeichnen, verwendet Python whitespace. Das bedeutet, dass Python erwartet, dass sich das Leerzeichen in Ihrem Code vorhersehbar verhält. Es wird ein + IndentationError + ausgelöst, wenn sich in einem Codeblock eine Zeile mit der falschen Anzahl von Leerzeichen befindet:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5   print('done')
 6
 7 foo()

Dies ist möglicherweise schwer zu erkennen, aber Zeile 5 besteht nur aus 2 Leerzeichen. Es sollte mit der Schleifenanweisung + for + übereinstimmen, die 4 Leerzeichen weiter ist. Zum Glück kann Python dies leicht erkennen und wird Ihnen schnell sagen, wo das Problem liegt.

Hier gibt es jedoch auch ein wenig Unklarheit. Soll die Zeile "+ print (" done ") " nach der " for " - Schleife oder innerhalb der " for +" - Schleife stehen? Wenn Sie den obigen Code ausführen, wird der folgende Fehler angezeigt:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
IndentationError: unindent does not match any outer indentation level

Obwohl der Traceback dem "+ SyntaxError " Traceback sehr ähnlich sieht, handelt es sich tatsächlich um einen " IndentationError ". Die Fehlermeldung ist auch sehr hilfreich. Hier erfahren Sie, dass die Einrückungsstufe der Zeile mit keiner anderen Einrückungsstufe übereinstimmt. Mit anderen Worten, " print (" done ") +" wird um 2 Leerzeichen eingerückt, aber Python kann keine andere Codezeile finden, die dieser Einrückungsstufe entspricht. Sie können dies schnell beheben, indem Sie sicherstellen, dass der Code mit der erwarteten Einrückungsstufe übereinstimmt.

Der andere Typ von "+ SyntaxError " ist der *" TabError +"* , den Sie sehen, wenn eine Zeile Tabulatoren oder Leerzeichen für den Einzug enthält, während der Rest der Datei den anderen enthält. Dies könnte versteckt bleiben, bis Python Sie darauf hinweist!

Wenn Ihre Tabulatorgröße dieselbe Breite wie die Anzahl der Leerzeichen in jeder Einrückungsstufe hat, sieht es möglicherweise so aus, als ob sich alle Zeilen auf derselben Ebene befinden. Wenn jedoch eine Zeile mit Leerzeichen und die andere mit Tabulatoren eingerückt wird, weist Python auf ein Problem hin:

 1 # indentation.py
 2 def foo():
 3     for i in range(10):
 4         print(i)
 5     print('done')
 6
 7 foo()

Hier wird Zeile 5 mit einem Tabulator anstelle von 4 Leerzeichen eingerückt. Dieser Codeblock könnte für Sie perfekt aussehen oder abhängig von Ihren Systemeinstellungen völlig falsch aussehen.

Python wird das Problem jedoch sofort bemerken. Bevor Sie den Code ausführen, um festzustellen, was Python Ihnen als falsch anzeigt, kann es hilfreich sein, ein Beispiel dafür zu sehen, wie der Code unter verschiedenen Einstellungen für die Registerkartenbreite aussieht:

$ tabs 4 # Sets the shell tab width to 4 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5       print('done')
     6
     7   foo()

$ tabs 8 # Sets the shell tab width to 8 spaces (standard)
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5           print('done')
     6
     7   foo()

$ tabs 3 # Sets the shell tab width to 3 spaces
$ cat -n indentation.py
     1   # indentation.py
     2   def foo():
     3       for i in range(10)
     4           print(i)
     5      print('done')
     6
     7   foo()

Beachten Sie den Unterschied in der Anzeige zwischen den drei obigen Beispielen. Der größte Teil des Codes verwendet 4 Leerzeichen für jede Einrückungsstufe, aber Zeile 5 verwendet in allen drei Beispielen eine einzelne Registerkarte. Die Breite der Registerkarte ändert sich basierend auf der Einstellung Registerkartenbreite :

  • Wenn die Tabulatorbreite 4 beträgt, sieht die Anweisung "+ print " so aus, als ob sie sich außerhalb der Schleife " for " befindet. Die Konsole gibt am Ende der Schleife "" erledigt "+" aus.

  • Wenn die Tabulatorbreite 8 beträgt, was für viele Systeme Standard ist, sieht die Anweisung "+ print " so aus, als ob sie sich in der Schleife " for " befindet. Die Konsole gibt nach jeder Nummer "" erledigt "+" aus.

  • Wenn die Tabulatorbreite 3 beträgt, ist die Anweisung + print + fehl am Platz. In diesem Fall stimmt Zeile 5 nicht mit einer Einrückungsstufe überein.

Wenn Sie den Code ausführen, wird der folgende Fehler und Traceback angezeigt:

$ python indentation.py
  File "indentation.py", line 5
    print('done')
                ^
TabError: inconsistent use of tabs and spaces in indentation

Beachten Sie den + TabError + anstelle des üblichen SyntaxError +. Python weist auf die Problemlinie hin und gibt Ihnen eine hilfreiche Fehlermeldung. Es zeigt Ihnen deutlich, dass in derselben Datei eine Mischung aus Tabulatoren und Leerzeichen zum Einrücken vorhanden ist.

Die Lösung hierfür besteht darin, dass alle Zeilen in derselben Python-Codedatei entweder Tabulatoren oder Leerzeichen verwenden, jedoch nicht beide. Für die obigen Codeblöcke besteht die Korrektur darin, die Registerkarte zu entfernen und durch 4 Leerzeichen zu ersetzen, die "" erledigt "" drucken, nachdem die "+ for +" - Schleife beendet ist.

Funktionen definieren und aufrufen

Beim Definieren oder Aufrufen von Funktionen kann es in Python zu einer ungültigen Syntax kommen. Beispielsweise wird ein "+ SyntaxError +" angezeigt, wenn Sie am Ende einer Funktionsdefinition ein Semikolon anstelle eines Doppelpunkts verwenden:

>>>

>>> def fun();
  File "<stdin>", line 1
    def fun();
             ^
SyntaxError: invalid syntax

Der Traceback hier ist sehr hilfreich, da das Caret direkt auf den Problemcharakter verweist. Sie können diese ungültige Syntax in Python löschen, indem Sie das Semikolon für einen Doppelpunkt ausschalten.

Außerdem müssen Schlüsselwortargumente sowohl in Funktionsdefinitionen als auch in Funktionsaufrufen in der richtigen Reihenfolge vorliegen. Schlüsselwortargumente kommen immer nach Positionsargumenten. Wenn Sie diese Reihenfolge nicht verwenden, wird ein "+ SyntaxError +" angezeigt:

>>>

>>> def fun(a, b):
...     print(a, b)
...
>>> fun(a=1, 2)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument

Auch hier ist die Fehlermeldung sehr hilfreich, um Ihnen genau zu sagen, was mit der Leitung nicht stimmt.

Python-Versionen ändern

Manchmal bricht Code, der in einer Python-Version einwandfrei funktioniert, in einer neueren Version. Dies ist auf offizielle Änderungen in der Sprachsyntax zurückzuführen. Das bekannteste Beispiel hierfür ist die Anweisung "+ print +", die von einem Schlüsselwort in Python 2 zu einer integrierten Funktion in Python 3 überging:

>>>

>>> # Valid Python 2 syntax that fails in Python 3
>>> print 'hello'
  File "<stdin>", line 1
    print 'hello'
                ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('hello')?

Dies ist eines der Beispiele, bei denen die mit dem + SyntaxError + bereitgestellte Fehlermeldung leuchtet! Es zeigt Ihnen nicht nur an, dass im Aufruf "+ print +" eine Klammer fehlt, sondern bietet auch den richtigen Code, mit dem Sie die Anweisung korrigieren können.

Ein weiteres Problem, auf das Sie möglicherweise stoßen, ist das Lesen oder Erlernen der Syntax, die in einer neueren Version von Python gültig ist, in der Version, in der Sie schreiben, jedoch nicht gültig ist. Ein Beispiel hierfür ist die Syntax f-string, die in Python-Versionen vor 3.6 nicht vorhanden ist:

>>>

>>> # Any version of python before 3.6 including 2.7
>>> w ='world'
>>> print(f'hello, {w}')
  File "<stdin>", line 1
    print(f'hello, {w}')
                      ^
SyntaxError: invalid syntax

In Versionen von Python vor 3.6 weiß der Interpreter nichts über die F-String-Syntax und gibt lediglich eine generische Meldung "" ungültige Syntax "" aus. Das Problem in diesem Fall ist, dass der Code looks vollkommen in Ordnung ist, aber mit einer älteren Version von Python ausgeführt wurde. Überprüfen Sie im Zweifelsfall, welche Python-Version Sie ausführen!

Die Python-Syntax entwickelt sich weiter und es gibt einige coole neue Funktionen, die in Python 3.8 eingeführt wurden:

Wenn Sie einige dieser neuen Funktionen ausprobieren möchten, müssen Sie sicherstellen, dass Sie in einer Python 3.8-Umgebung arbeiten. Andernfalls erhalten Sie einen "+ SyntaxError +".

Python 3.8 bietet auch die neue* + SyntaxWarning + *. Diese Warnung wird in Situationen angezeigt, in denen die Syntax gültig ist, aber dennoch verdächtig aussieht. Ein Beispiel hierfür wäre, wenn Sie ein Komma zwischen zwei Tupeln in einer Liste vermissen würden. Dies wäre eine gültige Syntax in Python-Versionen vor 3.8, aber der Code würde einen "+ TypeError +" auslösen, da ein Tupel nicht aufrufbar ist:

>>>

>>> [(1,2)(2,3)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Dieses "+ TypeError +" bedeutet, dass Sie ein Tupel nicht wie eine Funktion aufrufen können, wie es der Python-Interpreter glaubt.

In Python 3.8 löst dieser Code immer noch den "+ TypeError " aus, aber jetzt wird auch ein " SyntaxWarning +" angezeigt, der angibt, wie Sie das Problem beheben können:

>>>

>>> [(1,2)(2,3)]
<stdin>:1: SyntaxWarning: 'tuple' object is not callable; perhaps you missed a comma?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

Die hilfreiche Nachricht zum neuen + SyntaxWarning + enthält sogar einen Hinweis (" Vielleicht haben Sie ein Komma verpasst? "), Der Sie in die richtige Richtung weist!

Fazit

In diesem Tutorial haben Sie gesehen, welche Informationen der Traceback "+ SyntaxError +" enthält. Sie haben auch viele gängige Beispiele für ungültige Syntax in Python gesehen und die Lösungen für diese Probleme gefunden. Dies beschleunigt nicht nur Ihren Workflow, sondern macht Sie auch zu einem hilfreicheren Code-Prüfer!

Versuchen Sie beim Schreiben von Code, eine IDE zu verwenden, die die Python-Syntax versteht und Feedback gibt. Wenn Sie viele der ungültigen Python-Codebeispiele aus diesem Lernprogramm in eine gute IDE einfügen, sollten diese die Problemzeilen hervorheben, bevor Sie überhaupt Ihren Code ausführen können.

Das Erhalten eines + SyntaxError + während des Lernens von Python kann frustrierend sein, aber jetzt wissen Sie, wie Sie Traceback-Nachrichten verstehen und auf welche Formen ungültiger Syntax in Python Sie möglicherweise stoßen. Wenn Sie das nächste Mal einen "+ SyntaxError +" erhalten, sind Sie besser gerüstet, um das Problem schnell zu beheben!