Was tun mit "Unerwarteter Einzug" in Python?

117

Wie behebe ich den Fehler "unerwarteter Einzug" in Python?

Macintosh-Fan
quelle
4
Ein Codefragment, das den Fehler erzeugt, hilft uns, Ihr Problem besser zu verstehen. Bitte bearbeiten Sie Ihre Frage, um Code aufzunehmen.
RBerteig
7
Das klingt für mich nach einem Leerzeichenproblem, sodass ein Codebeispiel nutzlos wäre.
James McMahon
Vage Frage und keine Antwort gewählt.
rafael.js
"Wie behebe ich den Fehler ..."? Indem Sie feststellen, wo es aufgetreten ist, und die Fehlerursache beheben. In diesem Fall, indem Sie die Einrückung dieser bestimmten Zeile so aussehen lassen, wie Python es erwartet ...
Twalberg

Antworten:

132

Python verwendet den Abstand am Zeilenanfang, um zu bestimmen, wann Codeblöcke beginnen und enden. Fehler, die Sie bekommen können, sind:

Unerwarteter Einzug. Diese Codezeile hat am Anfang mehr Leerzeichen als die vorherige, aber die vorherige ist nicht der Anfang eines Unterblocks (z. B. if / while / for-Anweisung). Alle Codezeilen in einem Block müssen mit genau der gleichen Leerzeichenfolge beginnen. Zum Beispiel:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

Dieser ist besonders häufig, wenn Sie Python interaktiv ausführen: Stellen Sie sicher, dass Sie vor Ihren Befehlen keine zusätzlichen Leerzeichen einfügen. (Sehr ärgerlich beim Kopieren und Einfügen von Beispielcode!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent entspricht keiner äußeren Einrückungsstufe. Diese Codezeile hat am Anfang weniger Leerzeichen als die vorherige, entspricht aber auch keinem anderen Block, zu dem sie gehören könnte. Python kann sich nicht entscheiden, wohin es geht. Soll der endgültige Ausdruck beispielsweise im Folgenden Teil der if-Klausel sein oder nicht?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

Erwartet einen eingerückten Block. Diese Codezeile hat am Anfang die gleiche Anzahl von Leerzeichen wie die vorherige, aber die letzte Zeile sollte einen Block starten (z. B. if / while / for-Anweisung, Funktionsdefinition).

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

Wenn Sie eine Funktion wünschen, die nichts tut, verwenden Sie den Befehl "no-op" pass :

>>> def foo():
...     pass

Das Mischen von Tabulatoren und Leerzeichen ist zulässig (zumindest in meiner Python-Version), Python geht jedoch davon aus, dass Tabulatoren 8 Zeichen lang sind und möglicherweise nicht mit Ihrem Editor übereinstimmen. Sagen Sie einfach "Nein" zu Tabs. Die meisten Editoren erlauben es, sie automatisch durch Leerzeichen zu ersetzen.

Der beste Weg, um diese Probleme zu vermeiden, besteht darin, beim Einrücken eines Unterblocks immer eine konsistente Anzahl von Leerzeichen zu verwenden und im Idealfall eine gute IDE zu verwenden, die das Problem für Sie löst. Dadurch wird Ihr Code auch besser lesbar.

Alice Purcell
quelle
7
gute Erklärung. Außerdem habe ich einen unerwarteten Fehler beim Einrücken von Leerzeichen mit 'Tab' und 'Leertaste' in NotePad ++ ausgegeben, den 'Tab' durch 'Leerzeichen' ersetzt und behoben.
José Rosas Sáenz
2
@ JoséRosasSáenz Ihr Kommentar hat mir so viel Ärger
erspart
Eine weitere Ursache ist das Fehlen des exceptTeils einer tryKlausel. Der Code sieht richtig aus (da die nicht eingerückte Zeile außerhalb des tryBlocks liegen soll), aber Python meldet dies als "unerwarteten Einzug" -Fehler. Dies wird durch Hinzufügen der except, vielleicht mit pass(wie hier )
Dumbledad
@dumbledad Auf welcher Python-Version sehen Sie das? Wenn ich meine anprobiere (sowohl 2.7.15 als auch 3.6.8), bekomme ich einen SyntaxError
Alice Purcell
Ich habe diesen Fehler beim Kopieren / Einfügen von Code von einer Website festgestellt. Die Positionierung schien in Ordnung zu sein, aber ich musste den Leerraum entfernen und erneut mit Leerzeichen anwenden, bevor QGIS (3.10) den Code ausführen würde.
Benjamin
23

In Python ist der Abstand sehr wichtig, dies gibt die Struktur Ihrer Codeblöcke an. Dieser Fehler tritt auf, wenn Sie Ihre Codestruktur durcheinander bringen, zum Beispiel wie folgt:

def test_function() :
   if 5 > 3 :
   print "hello"

Möglicherweise enthält Ihre Datei auch eine Mischung aus Tabulatoren und Leerzeichen.

Ich schlage vor, Sie verwenden einen Python-Syntax-fähigen Editor wie PyScripter oder Netbeans

Yanjost
quelle
1
Ja, verwenden Sie auf jeden Fall Python-fähige Editoren! Ich hatte ein Problem, bei dem ich in Notepad ++ mit Standardeinstellungen bearbeitete und das Leerzeichen falsch war
Dave Archer
2
gemischte Tabulatoren und Leerzeichen lösen "SyntaxError: inkonsistente Verwendung von Tabulatoren und Leerzeichen beim Einrücken" aus
SilentGhost
Das Python Netbeans-Plugin konvertiert derzeit keine Tabulatoren in Leerzeichen aus vorhandenem Code. Dies geschieht jedoch, wenn Sie neuen Code schreiben.
James McMahon
PyCharm kann es konsistent konvertieren. Außerdem werden die Zeilen bei "Fehler" hervorgehoben. Ich verwende Zitate, weil dies nicht die 1960er Jahre sind und ich nicht glauben kann, dass eine wunderbare Sprache wie Python immer noch diesen hirntoten, zeitraubenden Fehler aufweist.
Echelon
Ich habe nach der Hälfte des Schreibens meines Codes unbeabsichtigt die Redaktion gewechselt und meine Einrückungen in den neueren Code gestopft. Die Änderung war für das Auge nicht offensichtlich, aber der Interpreter würde meinen Code nicht ausführen. Dieser Beitrag hat mir geholfen, das Problem zu finden.
Lucien Stals
21

Führen Sie Ihren Code mit der Option -tt aus, um herauszufinden, ob Sie Tabulatoren und Leerzeichen inkonsistent verwenden

Manoj ich
quelle
16

Aktivieren Sie das sichtbare Leerzeichen in dem von Ihnen verwendeten Editor und aktivieren Sie das Ersetzen von Tabulatoren durch Leerzeichen.

Während Sie Tabs mit Python verwenden können, führt das Mischen von Tabs und Leerzeichen normalerweise zu dem Fehler, der auftritt. Das Ersetzen von Tabulatoren durch 4 Leerzeichen ist der empfohlene Ansatz zum Schreiben von Python-Code.

James McMahon
quelle
1
Wie machen Sie das konkret? Ich benutze Sublime.
Chibole
8

Durch korrekte Einrückung. Python ist Whitespace-fähig, daher müssen Sie die Einrückungsrichtlinien für Blöcke befolgen, da sonst Einrückungsfehler auftreten.

workmad3
quelle
6

Wenn Sie Python mit Sublime schreiben und Einrückungsfehler erhalten,

Ansicht -> Einrückung -> Einrückung in Leerzeichen umwandeln

Das Problem, das ich beschreibe, wird vom Sublime-Texteditor verursacht. Das gleiche Problem könnte auch von anderen Editoren verursacht werden. Im Wesentlichen hat das Problem damit zu tun, dass Python Einrückungen in Form von Leerzeichen behandeln möchte, während verschiedene Editoren die Einrückungen in Form von Tabulatoren codieren.

Puneet Lamba
quelle
oh ... also verursacht das Erhabene das?
Nitin
Ja, das von mir beschriebene Problem wird von Sublime verursacht. Könnte auch von anderen Editoren verursacht werden. Im Wesentlichen hat das Problem damit zu tun, dass Python Einrückungen in Form von Leerzeichen behandeln möchte, während verschiedene Editoren die Einrückungen in Form von Tabulatoren codieren.
Puneet Lamba
Ich hatte das gleiche Problem mit Notepad ++. Was die Augen wahr traf, brauchte einige Zeit, um dies zu knacken. Ich musste den Cursor ein Zeichen nach dem anderen bewegen, um herauszufinden, dass der Editor einige Leerzeichen in Tabulatoren konvertiert hatte
Bharat Anand
4

Stellen Sie sicher, dass Sie in Ihrem Editor die Option "Leerzeichen anstelle von Tabulatoren einfügen" verwenden. Anschließend können Sie eine Registerkartenbreite von beispielsweise 4 auswählen. Diese Optionen finden Sie in gedit unter Bearbeiten -> Einstellungen -> Editor.

Fazit: USE SPACES nicht Tabs

Alex
quelle
Ihr Endergebnis hat es geschafft!
Nick Div
3

Dieser Fehler kann auch auftreten, wenn etwas in den Python-Interpreter (Terminal / Konsole) eingefügt wird.

Beachten Sie, dass der Interpreter eine leere Zeile als Ende eines Ausdrucks interpretiert. Wenn Sie also etwas wie einfügen

def my_function():
    x = 3

    y = 7

Der Interpreter interpretiert die leere Zeile zuvor y = 7als das Ende des Ausdrucks, dh wenn Sie mit der Definition Ihrer Funktion fertig sind, und die nächste Zeile y = 7hat einen falschen Einzug, da es sich um einen neuen Ausdruck handelt.

Zoltán
quelle
Der Schlüssel ist, dass Leerzeilen innerhalb der Funktionsdefinition in Ordnung sind, aber sie müssen immer noch das anfängliche Leerzeichen haben, da Python jede Leerzeile als Ende der Funktion
interpretiert
3

Ein Problem, das anscheinend nicht erwähnt wurde, ist, dass dieser Fehler aufgrund eines Problems mit dem Code auftreten kann, das nichts mit Einrückung zu tun hat.

Nehmen Sie zum Beispiel das folgende Skript:

def add_one(x):
    try:
        return x + 1
add_one(5)

Dies gibt eine zurück, IndentationError: unexpected unindentwenn das Problem natürlich eine fehlende except:Aussage ist.

Mein Punkt: Überprüfen Sie den obigen Code, in dem der unerwartete (un) Einzug gemeldet wird!

WMoreland
quelle
2

Wenn die Einrückung in Ordnung ist, prüfen Sie, ob Ihr Editor über die Option "Leerzeichen anzeigen" verfügt. Wenn Sie dies aktivieren, sollten Sie feststellen können, wo Leerzeichen und Tabulatoren gemischt sind.


quelle
2

Es gibt einen Trick, der bei mir immer funktioniert hat:

Wenn Sie einen unerwarteten Einzug erhalten haben und feststellen, dass der gesamte Code perfekt eingerückt ist, öffnen Sie ihn mit einem anderen Editor, und Sie werden sehen, welche Codezeile nicht eingerückt ist.

Es ist mir passiert, als ich vim, gedit oder solche Editoren verwendet habe.

Versuchen Sie, nur 1 Editor für Ihren Code zu verwenden.

Jesus Rodriguez
quelle
2

Kopieren Sie einfach Ihr Skript und geben Sie unter "" "Ihren gesamten Code" "" ein ...

Geben Sie diese Zeile in einer Variablen an.

a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..

Führen Sie diesen Code jetzt im Sublime Editor mit Strg + B aus. Jetzt wird eingerückter Code in der Konsole gedruckt. das ist es

Mohideen bin Mohammed
quelle
Wie werde ich meinen Code ausführen? Muss ich "" "und" "" entfernen und den Ausdruck a.replace entfernen und normal ausführen?
Chibole
Nein "" "" "" (dreifache Anführungszeichen) verweisen eher auf Ihren Inhalt als auf eine Zeichenfolge. Es ist erforderlich, weil Ihr Code möglicherweise eine Zeichenfolge enthält, die in einfachen / doppelten Anführungszeichen steht, also "" "erforderlich ist.
Mohideen bin Mohammed
2

Sie müssen lediglich Leerzeichen oder Tabulatorzeichen vom Anfang der folgenden Codes entfernen

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Sunil Tamang
quelle
2

Führen Sie den folgenden Befehl aus, um das Problem zu beheben:

autopep8 -i <filename>.py

Dadurch wird Ihr Code aktualisiert und alle Einrückungsfehler behoben :)

Hoffe das wird sich lösen

Sharyar Vohra
quelle
Sehr einfach zu implementieren. Funktioniert jedes Mal für mich, deshalb ist es hoffentlich für jemanden von Vorteil :)
Sharyar Vohra
1

Notepad ++ hat den Tabulatorbereich korrekt angegeben, aber das Einrückungsproblem wurde schließlich im Sublime-Texteditor gefunden.

Verwenden Sie den Sublime-Texteditor und gehen Sie Zeile für Zeile

HimalayanCoder
quelle
0

Das Einrücken in Python ist wichtig und dient im Gegensatz zu vielen anderen Programmiersprachen nicht der Lesbarkeit des Codes. Wenn zwischen aufeinanderfolgenden Befehlen in Ihrem Code Leerzeichen oder Tabulatoren vorhanden sind, gibt Python diesen Fehler aus, da Python dafür empfindlich ist. Wir werden diesen Fehler wahrscheinlich erhalten, wenn wir Code in ein beliebiges Python kopieren und einfügen. Stellen Sie sicher, dass Sie diese Leerzeichen mit einem Texteditor wie Notepad ++ identifizieren und entfernen, oder entfernen Sie das Leerzeichen manuell aus der Codezeile, in der eine Fehlermeldung angezeigt wird.

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

Vielen Dank!

ashu Kr
quelle