Was tun mit "Unerwarteter Einzug" in Python?


117

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


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.


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


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


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.


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.


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.


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


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.


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!


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.


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.


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


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)

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


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


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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.