Python ist in vielerlei Hinsicht nachsichtig, sein Parser jedoch nicht. Ein SyntaxError stoppt Ihr Programm, bevor eine einzige Zeile ausgeführt wird, was frustrierend ist, wenn die Lösung meist nur ein fehlendes Zeichen ist. Die gute Nachricht ist, dass dieselbe Handvoll Fehler für fast jeden Syntaxfehler verantwortlich ist, dem Sie je begegnen werden, und sobald Sie sie auf Anhieb erkennen, beheben Sie sie in Sekunden.
Dieser Leitfaden behandelt die häufigsten Python-Syntaxfehler sowie die eng verwandten Fälle von IndentationError, TabError und NameError, die Menschen aus denselben Gründen stolpern lassen. Jeder Abschnitt zeigt einen fehlerhaften Codeausschnitt, die von Python angezeigte Fehlermeldung und die korrigierte Version. Alle Ausschnitte sind real und zum Kopieren bereit, sodass Sie den Fehler reproduzieren und die Lösung in Ihrem eigenen Interpreter bestätigen können.
Was ist ein Syntaxfehler in Python?
Ein Syntaxfehler bedeutet, dass Ihr Code gegen die Grammatik der Sprache verstößt, sodass der Interpreter ihn nicht in etwas Ausführbares umwandeln kann. Da das Parsen vor der Ausführung stattfindet, startet das Programm nie: Nichts wird ausgegeben, keine Nebeneffekte treten auf, Sie erhalten lediglich einen Traceback, der mit SyntaxError endet, mit einem Caret, das auf das fehlerhafte Token zeigt oder direkt danach.
Hier ist das klassische Beispiel: ein Aufruf ohne schließende Klammer.
print("Hello, Python!"
Python erreicht das Dateiende und wartet noch immer auf die ), die den Aufruf schließt, und meldet das Problem deshalb am Ende der Eingabe.
SyntaxError: '(' was never closed
Eine Sache, die Sie frühzeitig in Ihrem mentalen Modell korrigieren sollten: Ein Syntaxfehler ist nicht dasselbe wie ein Laufzeitfehler. Syntaxfehler werden beim Parsen erkannt und verhindern, dass das Programm überhaupt startet. Laufzeitfehler, wie das Dividieren durch null oder das Öffnen einer nicht existierenden Datei, treten auf, während ein syntaktisch korrektes Programm ausgeführt wird. Dieser Leitfaden behandelt die erste Art, also diejenigen, die Ihren Code nie ausführen lassen.
Häufige Python-Syntaxfehler und wie man sie behebt
Die folgenden Abschnitte folgen in etwa der Reihenfolge, in der Sie diesen Fehlern wahrscheinlich begegnen. Jeder ist klein und in sich abgeschlossen, also springen Sie ruhig zu dem Fehler, den Sie gerade vor sich haben.
1. Fehlende oder nicht übereinstimmende Klammern
Klammern gruppieren Ausdrücke und rufen Funktionen auf, und sie müssen ausbalanciert sein. Eine nicht geschlossene öffnende Klammer ist einer der häufigsten Syntaxfehler, besonders in längeren Bedingungen, wo das Schließen leicht vergessen wird.
if (x > 10: print("x is greater than 10")
Python erwartet eine schließende Klammer vor dem Doppelpunkt und teilt Ihnen dies mit.
SyntaxError: closing parenthesis ':' does not match opening parenthesis '('
Die Lösung besteht darin, sicherzustellen, dass jede öffnende Klammer eine passende schließende Klammer derselben Art hat. Schließen Sie die Klammer vor dem Doppelpunkt, und die Bedingung wird korrekt geparst. Dieselbe Regel gilt für eckige Klammern [] und geschweifte Klammern {}; Editoren, die übereinstimmende Klammern hervorheben, fangen die meisten davon für Sie ab.
if (x > 10): print("x is greater than 10")
2. Fehlender Doppelpunkt in einer Steueranweisung
Jeder zusammengesetzte Anweisungs-Header in Python endet mit einem Doppelpunkt: if, elif, else, for, while, def, class, try und die übrigen. Den Doppelpunkt wegzulassen ist ein klassischer Fehler, wenn man aus einer Sprache kommt, die stattdessen geschweifte Klammern verwendet.
if x > 5 print("x is greater than 5")
Modernes Python zeigt direkt auf das fehlende Token.
SyntaxError: expected ':'
Fügen Sie den Doppelpunkt am Ende der Header-Zeile hinzu. Immer wenn Sie eine Anweisung schreiben, die einen neuen eingerückten Block einleitet, sollte Ihr Auge automatisch nach dem abschließenden Doppelpunkt suchen.
if x > 5: print("x is greater than 5")
3. Erwarteter eingerückter Block (IndentationError)
Python verwendet Einrückung anstelle von geschweiften Klammern, um Codeblöcke zu markieren, daher muss der Rumpf jedes if-Statements, jeder Schleife oder Funktion eingerückt sein. Schreiben Sie einen Header mit Doppelpunkt und vergessen Sie dann, die nächste Zeile einzurücken, hat der Parser keinen Block, dem er zugeordnet werden kann.
for i in range(5): print(i)
Der Interpreter meldet, dass er nach dem Schleifen-Header einen eingerückten Block erwartet hatte.
IndentationError: expected an indented block after 'for' statement on line 1
Rücken Sie den Rumpf um vier Leerzeichen ein, die Python-Standardkonvention. Die Einrückung ist hier die Syntax, keine Stilpräferenz: So weiß Python, welche Zeilen zur Schleife gehören.
for i in range(5): print(i)
4. Unerwartete Einrückung (IndentationError)
Der entgegengesetzte Fehler ist das Einrücken einer Zeile, die auf derselben Ebene wie ihre Nachbarn stehen sollte. Die Einrückung muss innerhalb eines Blocks konsistent sein, daher bricht ein verirrtes zusätzliches Leerzeichen oder zwei auf einer Zeile das Parsen.
def example(): print("First line") print("Second line")
Das zweite print ist ohne Grund stärker eingerückt als das erste, und Python lehnt es ab.
IndentationError: unexpected indent
Richten Sie jede Anweisung im selben Block auf derselben Spalte aus. Wählen Sie vier Leerzeichen pro Ebene und halten Sie das einheitlich, und die automatische Einrückung Ihres Editors hält Sie meistens auf dem richtigen Kurs.
def example(): print("First line") print("Second line")
5. Mischung von Tabs und Leerzeichen (TabError)
Ein besonders heimtückischer Einrückungsfehler ist das Mischen von Tabs und Leerzeichen innerhalb desselben Blocks. Beide können auf dem Bildschirm identisch aussehen, aber Python behandelt sie als unterschiedlich und löst einen dedizierten TabError aus. Im folgenden Ausschnitt verwendet die erste Rumpfzeile Leerzeichen und die zweite einen Tab.
def greet(name): message = "Hi " + name return message
Obwohl beide Zeilen visuell bündig sind, kann Python nicht feststellen, ob sie auf derselben Ebene liegen.
TabError: inconsistent use of tabs and spaces in indentation
Entscheiden Sie sich für Leerzeichen, was PEP 8 empfiehlt, und mischen Sie niemals. Konfigurieren Sie Ihren Editor so, dass er beim Drücken von Tab Leerzeichen einfügt, und führen Sie eine Suchen-und-Ersetzen-Aktion in jeder Datei durch, die bereits eine Mischung enthält. Das erneute Einrücken beider Rumpfzeilen mit vier Leerzeichen behebt den Fehler.
Tab-versus-space-Fehler sind unsichtbar, bis Sie die Leerraumdarstellung einschalten. Die meisten Editoren haben einen Schalter "Leerzeichen anzeigen" oder "Steuerzeichen rendern", der Tabs und Leerzeichen als unterschiedliche Markierungen darstellt. Schalten Sie ihn einmal ein, und diese Fehler hören auf, rätselhaft zu sein.
6. EOL beim Scannen eines String-Literals
Ein String muss auf derselben Zeile mit übereinstimmenden Anführungszeichen geöffnet und geschlossen werden. Vergessen Sie das schließende Anführungszeichen oder schließen Sie es mit der falschen Art, trifft Python das Zeilenende, während es sich noch im String befindet.
name = 'John"
Der String öffnet mit einem einfachen Anführungszeichen, schließt aber mit einem doppelten, sodass er nie abgeschlossen wird.
SyntaxError: unterminated string literal (detected at line 1)
Verwenden Sie dasselbe Anführungszeichen an beiden Enden. Wenn Ihr Text ein Anführungszeichen enthält, umschließen Sie den String mit der anderen Art, zum Beispiel "O'Brien", oder verwenden Sie einen Triple-Quoted-String für Text, der mehrere Zeilen umfasst. Ältere Python-Versionen formulieren denselben Fehler als EOL while scanning string literal, aber die Ursache ist identisch.
name = 'John'
7. EOF beim Scannen (unerwartetes Dateiende)
Eng verwandt ist die Dateiende-Variante: eine öffnende Klammer oder ein Anführungszeichen, das nie geschlossen wird, bevor die Datei endet. Dies ist der Fall des nicht geschlossenen Aufrufs von weiter oben, und er verdient einen eigenen Abschnitt, weil die Fehlermeldung eine andere Ursache nennt. Eine mehrzeilige Struktur mit einem fehlenden Schließer ist der übliche Schuldige.
numbers = [1, 2, 3 print(sum(numbers))
Da die Liste nie geschlossen wird, liest Python weiter, behandelt die nächste Zeile als Teil der Liste und läuft am Ende der Datei davon.
SyntaxError: '[' was never closed
Schließen Sie die eckige Klammer dort, wo die Struktur endet. Wenn ein Fehler auf das absolute Ende einer Datei zeigt, liegt das eigentliche Problem fast immer an einem öffnenden Zeichen mehrere Zeilen weiter oben, das nie abgeglichen wurde. Scannen Sie also vom Caret aus aufwärts.
numbers = [1, 2, 3] print(sum(numbers))
8. Ungültige Zuweisung: = versus ==
Ein einzelnes = weist einen Wert zu; ein doppeltes == vergleicht zwei Werte. Verwenden Sie eine Zuweisung dort, wo ein Vergleich gehört, etwa in einer if-Bedingung, und Python lehnt es ab, weil Sie nicht innerhalb eines einfachen Bedingungstests zuweisen können.
if x = 10: print("x is 10")
Neuere Python-Versionen sind explizit darüber, was Sie wahrscheinlich gemeint haben.
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
Verwenden Sie == zum Vergleichen und reservieren Sie = für Zuweisungen. Wenn Sie wirklich im Rahmen eines Ausdrucks zuweisen möchten, ist der Walrus-Operator := dafür gedacht, aber für eine gewöhnliche Bedingung meinen Sie fast immer ==.
if x == 10: print("x is 10")
Sobald Ihr Parser sauber läuft, ist der schwierigste Teil eines Scrapers der Abruf: JavaScript-Seiten rendern und IPs rotieren, damit Sie nicht blockiert werden. Die Crawling API erledigt beides hinter einer einzigen Anfrage und liefert fertiges HTML zurück, sodass Ihr fehlerfreies Python Daten parst, anstatt gegen eine Flotte von Headless-Browsern und einen Proxy-Pool zu kämpfen.
9. Reserviertes Schlüsselwort als Name verwenden
Python reserviert Wörter wie for, if, class, return und import für die Sprache selbst. Versuchen Sie, eines davon als Variablenname zu verwenden, sieht der Parser ein Schlüsselwort, wo er einen Bezeichner erwartet.
for = 10
Die Zuweisung an for ist ungültig, weil for nur eine Schleife einleiten kann.
SyntaxError: invalid syntax
Wählen Sie einen Namen, der nicht reserviert ist, idealerweise einen, der den Wert beschreibt. Wenn Sie unsicher sind, ob ein Name vergeben ist, listet Pythons eigenes keyword-Modul jedes reservierte Wort auf; einen Namen gegen keyword.kwlist zu prüfen klärt das sofort.
import keyword num_for = 10 print("for" in keyword.kwlist) # True, so it is off limits
10. Fehlende oder falsch platzierte Kommas
Kommas trennen Elemente in Listen, Tupeln, Dictionaries und Argumentlisten. Lassen Sie eines zwischen zwei String-Literalen weg, versucht Python, sie als einzelnen Ausdruck zu lesen, was ungültig ist.
items = ["apple" "banana", "cherry"]
Python zeigt auf den zweiten String, wo ein Komma erwartet wurde.
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Setzen Sie zwischen jedes Element ein Komma. Dieser Fehler beißt oft, weil Python zwei benachbarte String-Literale stillschweigend verketten kann, sodass "apple" "banana" manchmal ohne Fehler geparst wird und "applebanana" erzeugt, ein verwirrender Bug statt eines klaren Fehlers. Trennen Sie Ihre Elemente daher immer explizit durch Kommas.
items = ["apple", "banana", "cherry"]
11. Fehlerhafte Import-Anweisungen
Imports haben ihre eigene Grammatik. Vergessen Sie zu benennen, was Sie importieren, ist die Form from ... import unvollständig.
from math import
Der Parser erreicht das Zeilenende und erwartet noch immer einen zu importierenden Namen.
SyntaxError: invalid syntax
Benennen Sie, was Sie importieren, oder importieren Sie das gesamte Modul. Beide folgenden Formen sind gültig: das Modul importieren und über Punktnotation darauf zugreifen, oder bestimmte Namen daraus extrahieren.
import os import sys from math import sqrt
12. print als Anweisung statt als Funktion
In Python 2 war print eine Anweisung und wurde ohne Klammern geschrieben. In Python 3 ist es eine reguläre Funktion, daher ist die alte Form ein Syntaxfehler. Dies stolpert noch immer jeden, der Beispiele aus alten Tutorials kopiert.
print "Hello, Python!"
Python 3 schlägt die Korrektur sogar in der Fehlermeldung vor.
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?
Setzen Sie die Argumente in Klammern, genauso wie Sie jede andere Funktion aufrufen. Dasselbe gilt für exec, das in Python 3 ebenfalls zur Funktion wurde.
print("Hello, Python!")
13. NameError durch einen Tippfehler
Dieser letzte ist streng genommen kein Syntaxfehler: Der Code wird korrekt geparst, schlägt also zur Laufzeit fehl statt beim Parsen. Er gehört hierher, weil die Ursache dieselbe Familie kleiner Flüchtigkeitsfehler ist und weil die Lösung genauso schnell geht. Schreiben Sie einen Variablennamen falsch, kann Python ihn nicht finden.
message = "hello" print(mesage)
Der Name mesage wurde nie definiert, daher löst Python einen NameError aus und rät hilfreicherweise, was Sie gemeint haben.
NameError: name 'mesage' is not defined. Did you mean: 'message'?
Korrigieren Sie die Schreibweise, damit der Name mit seiner Definition übereinstimmt. Da dieser Fehler nur erscheint, wenn die Zeile tatsächlich ausgeführt wird, kann er sich in einem selten erreichten Zweig verbergen, was ein weiterer Grund ist, Ihren Code in kleinen Stücken zu testen und nicht alles auf einmal.
message = "hello" print(message)
So vermeiden Sie Python-Syntaxfehler
Sie werden diese Fehler nie ganz vermeiden, aber Sie können fast alle davon abfangen, bevor Sie irgendetwas ausführen. Einige Gewohnheiten erledigen den Großteil der Arbeit.
- Verwenden Sie einen Editor mit Syntaxhervorhebung. VS Code, PyCharm und selbst leichtgewichtige Editoren wie Thonny markieren nicht übereinstimmende Klammern, schlechte Einrückung und unterbrochene Strings beim Tippen, sodass die meisten Fehler den Interpreter nie erreichen.
-
Wählen Sie vier Leerzeichen und mischen Sie niemals Tabs. Konfigurieren Sie Ihren Editor so, dass er beim Drücken von Tab Leerzeichen einfügt. Konsistente Einrückung allein beseitigt die gesamte Familie der
IndentationError- undTabError-Fehler. - Führen Sie einen Linter aus. Tools wie Pylint, Flake8 und Ruff scannen Ihren Code auf Syntaxprobleme, fehlende Kommas und undefinierte Namen, bevor Sie ihn ausführen, und die meisten lassen sich direkt in Ihren Editor einbinden.
- Lesen Sie die Fehlermeldung und den Caret. Modernes Python zeigt auf das genaue Token und schlägt oft die Lösung vor. Die Zeilennummer ist dort, wo Python das Problem bemerkt hat; bei nicht geschlossenen Klammern liegt die eigentliche Ursache meist eine oder zwei Zeilen weiter oben.
- Testen Sie in kleinen Stücken. Führen Sie einige Zeilen auf einmal aus, nicht ein ganzes Skript auf einmal. Fehler lassen sich viel leichter lokalisieren, wenn nur eine Handvoll neuer Zeilen verantwortlich sein können.
Diese Gewohnheiten halten Ihren Code sauber, sobald Sie über Toy-Snippets hinaus in echte Projekte einsteigen, einschließlich Scraper. Wenn Sie eine vollständige Anleitung wünschen, die funktionierendes Python in der Praxis einsetzt, lesen Sie how to scrape a website with Python, und für eine Übersicht der Tools, auf die Sie zurückgreifen werden, die best Python web scraping libraries.
Wichtigste Erkenntnisse
- Syntaxfehler stoppen das Programm, bevor es läuft. Anders als Laufzeitfehler werden sie beim Parsen erkannt, sodass nichts ausgeführt wird, bis Sie sie beheben.
- Die meisten Syntaxfehler sind Zeichensetzungsfehler. Ein fehlender Doppelpunkt, eine nicht geschlossene Klammer, ein nicht übereinstimmendes Anführungszeichen oder ein vergessenes Komma deckt die große Mehrheit der Fälle ab.
- Einrückung ist Syntax, kein Stil. Rücken Sie Block-Rümpfe konsistent ein, verwenden Sie vier Leerzeichen und mischen Sie niemals Tabs und Leerzeichen, um die gesamte Familie der IndentationError- und TabError-Fehler zu vermeiden.
- = weist zu und == vergleicht. Das eine dort zu verwenden, wo das andere hingehört, ist ein häufiger Fehler, auf den modernes Python jetzt direkt hinweist.
- Lesen Sie Meldung und Caret. Neuere Python-Versionen nennen das genaue Token und schlagen oft die Lösung vor; bei Dateiende-Fehlern liegt die eigentliche Ursache meist an einem nicht geschlossenen Öffner weiter oben.
Häufig gestellte Fragen
Was ist der Unterschied zwischen einem Syntaxfehler und einem Laufzeitfehler in Python?
Ein Syntaxfehler verletzt die Grammatik der Sprache, sodass der Interpreter Ihren Code nicht parsen kann und das Programm nie startet. Ein Laufzeitfehler tritt auf, während ein gültiges Programm ausgeführt wird, wenn eine Operation fehlschlägt, etwa beim Dividieren durch null oder beim Öffnen einer nicht existierenden Datei. Syntaxfehler werden vor der Ausführung abgefangen; Laufzeitfehler werden während der Ausführung abgefangen.
Warum legt Python so viel Wert auf Einrückung?
Python verwendet Einrückung anstelle von geschweiften Klammern, um Codeblöcke zu definieren, was den Code lesbar und einheitlich hält. Da der Leerraum die Syntax ist, ist inkonsistente Einrückung ein echter Fehler und keine Stilnörgelei. Entscheiden Sie sich für vier Leerzeichen pro Ebene und lassen Sie Ihren Editor es durchsetzen, hört die Einrückung auf, eine Fehlerquelle zu sein.
Wie behebe ich "SyntaxError: unexpected EOF while parsing"?
Diese Meldung bedeutet, dass eine öffnende Klammer, Parenthese oder ein Anführungszeichen nie geschlossen wurde, sodass Python am Dateiende angekommen ist und noch immer auf den Schließer wartet. Beginnen Sie bei der Zeile, auf die der Fehler zeigt, und scannen Sie aufwärts nach einem nicht abgeglichenen Öffner. Neuere Python-Versionen formulieren dasselbe Problem spezifischer, zum Beispiel '(' was never closed, was Ihnen genau sagt, welches Zeichen Sie suchen müssen.
Warum erhalte ich einen TabError, obwohl mein Code korrekt eingerückt aussieht?
Weil Tabs und Leerzeichen auf dem Bildschirm identisch aussehen können, während Python sie als unterschiedliche Zeichen behandelt. Wenn eine Zeile in einem Block einen Tab verwendet und eine andere Leerzeichen, ist die Einrückung inkonsistent, obwohl sie visuell bündig ist. Schalten Sie die Leerraumdarstellung in Ihrem Editor ein, konvertieren Sie alles auf Leerzeichen, und der Fehler verschwindet.
Wie kann ich Syntaxfehler abfangen, bevor ich meinen Code ausführe?
Verwenden Sie einen Editor mit Syntaxhervorhebung und einen Linter wie Pylint, Flake8 oder Ruff. Diese markieren nicht übereinstimmende Klammern, fehlende Kommas, schlechte Einrückung und undefinierte Namen beim Tippen, sodass die meisten Fehler den Interpreter nie erreichen. Das Testen kleiner Codeabschnitte isoliert außerdem jeden Fehler, der doch durchrutscht.
Ist print eine Funktion oder eine Anweisung in Python?
In Python 3 ist es eine Funktion, daher müssen Sie es mit Klammern aufrufen: print("text"). Die bloße Form print "text" war nur in Python 2 gültig und ist jetzt ein Syntaxfehler. Wenn Sie "Missing parentheses in call to print" sehen, lesen Sie Python-2-Style-Code in einem Python-3-Interpreter.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
