IndentationError: unindent entspricht keiner äußeren Einrückungsstufe

584

Wenn ich den folgenden Python-Code kompiliere, erhalte ich

IndentationError: unindent entspricht keiner äußeren Einrückungsstufe


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

Warum?

cbrulak
quelle
7
und wahrscheinlich ist der Bereich (1, n + 1) besser, wenn Sie 'n' in Ihre Berechnung
einbeziehen
7
Ich hatte den gleichen Fehler, aber ich habe zufällig eine Methode ganz oben im Code leicht nach links eingerückt , wodurch dieser Fehler am Ende der nächsten Methode danach angezeigt wurde. Dieser Fehler kann also nicht nur beim Mischen von Tabulatoren und Leerzeichen auftreten.
Prof. Falken Vertrag verletzt
14
Ich verwende Sublime Text 3. Ich habe ein Django-Projekt. Ich habe den Fehler mitView > Indentation > Intent Using Spaces
AbhimanyuAryan
Hatte dieses Problem in Pycharm, funktionierte das Anpassen von Tabs und Abständen in Konfigurationen nicht. Das Problem war, dass ich eine ~ / .editorconfig-Datei hatte, die die Pycharm-Konfiguration überschrieb.
Ken Myers
Ich habe festgestellt, dass die Verwendung von IDLE das Auffinden von Einrückungsproblemen erheblich erleichtert. Es werden eindeutig Einrückungsfehler gefunden, die die meisten Redakteure nicht finden.
Dennis Gathagu

Antworten:

668

Andere Poster sind wahrscheinlich korrekt. Möglicherweise sind Leerzeichen mit Ihren Registerkarten gemischt. Versuchen Sie, eine Suche durchzuführen und zu ersetzen, um alle Registerkarten durch ein paar Leerzeichen zu ersetzen.

Versuche dies:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)
Kevin Tighe
quelle
2
Ja, ich musste in den letzten beiden Zeilen wirklich über dem inneren Schleifenteil platzieren (nur in SO). Ich
weiß
3
Meine erste Zeile, "result = 0" (die 1 sein sollte, danke für die Korrektur), war beabstandet, während der Rest mit Registerkarten versehen war, verdammt, ich wusste nicht, dass Python so ist
cbrulak
1
Ja, das kann schwierig sein. Ich benutze Emacs, um Python zu bearbeiten, und ich habe es so eingerichtet, dass Tabulatoren immer durch Leerzeichen in Py-Dateien ersetzt werden, damit ich dieses Problem nicht habe. Notepad ++ hat möglicherweise auch eine solche Option.
Kevin Tighe
3
Habe das gleiche Problem atm :). SublimeText zeigt Leerzeichen als Punkte an, was ziemlich nützlich ist.
Kris
Halten Sie also gedrückt, Sie können mit Leerzeichen ODER Tabulatoren einrücken. Sie müssen nur konsequent sein? Pony Kopf
David
265

WICHTIG : Leerzeichen sind die bevorzugte Methode - siehe PEP008 Einrückung und Tabulatoren oder Leerzeichen? . (Danke an @Siha dafür.)

Für Sublime TextBenutzer:

Stellen Sie ein Sublime Text, dass Registerkarten zum Einrücken verwendet werden sollen: View-> Indentation->Convert Indentation to Tabs

Deaktivieren Sie die Indent Using SpacesOption auch im selben Untermenü oben. Dadurch wird dieses Problem sofort behoben.

enabledgeek
quelle
1
Stellen Sie auch bei der Verwendung von Python sicher, dass Sie eine ähnliche Option in dem von Ihnen verwendeten IDE / Texteditor festlegen
enabledgeek
20
Auch unter ATOM, Pakete> Leerzeichen> Leerzeichen in Tabulatoren konvertieren, vermeiden Sie Kopfschmerzen bei Syntaxfehlern in Python!
Loretoparisi
1
Leerzeichen sind die bevorzugte Methode - siehe PEP008 Einrückung und Tabulatoren oder Leerzeichen? . Sublime kann auch so eingerichtet werden.
SiHa
13
Sie sagen, Leerzeichen sind die bevorzugte Methode, aber Ihre Antwort fordert die Leute auf, sublime zu bitten, stattdessen Tabulatoren zu verwenden! Ich bin verwirrt
gota
@NunoCalaim Nun, leider geschah das, nachdem ich die Frage beantwortet hatte. Wenn Sie ein neues Projekt starten, verwenden Sie bitte die bevorzugte Technik der Räume. Aus diesem Grund habe ich eine fett gedruckte Bearbeitung vorgenommen, damit Neulinge den Haftungsausschluss kennen.
Activatedgeek
137

Um auf einfache Weise nach Problemen mit Tabulatoren / Leerzeichen zu suchen, können Sie Folgendes tun:

python -m tabnanny yourfile.py

oder du kannst deinen Editor natürlich einfach richtig einrichten :-)

André
quelle
1
Ich habe dies in einer Datei mit einem Tab / Space-Einrückungsfehler versucht, aber überhaupt keine Ausgabe mit einer falschen Tab-Datei. irgendeine Idee?
Luchux
1
Ich hatte ein Problem mit Leerzeichen und der Fehler besagte, dass es sich um Zeile 191 handelte, aber dank Tabnanny stellte ich fest, dass das eigentliche Problem nicht in dieser Zeile, sondern in der obigen Zeile lag.
richar8086
Vielen Dank! Was für ein toller Tipp. Der Fehler wurde von flake8 im VS-Code identifiziert, konnte jedoch nicht identifizieren, wo das Problem lag - tabnanny tat dies in einer Mikrosekunde.
Steve
39

Sind Sie sicher, dass Sie keine Tabulatoren und Leerzeichen in Ihrem Einrückungsweißraum mischen? (Das wird diesen Fehler verursachen.)

Beachten Sie, dass im Python-Code keine Registerkarten verwendet werden. Siehe den Styleguide . Sie sollten Notepad ++ so konfigurieren, dass Leerzeichen für Tabulatoren eingefügt werden.

zdan
quelle
Ich bin verwirrt. In der obigen Antwort wird angegeben, dass eine Texteditoroption so geändert werden soll, dass Tabulatoren anstelle von Leerzeichen verwendet werden.
Spurra
3
@BananaCode Solange Sie NUR Tabulatoren oder NUR Leerzeichen verwenden, spielt es technisch keine Rolle, welche Sie wählen. Obwohl für Python Leerzeichen bevorzugt werden, siehe den Link, auf den ich verwiesen habe.
zdan
21

Immer wenn ich auf diesen Fehler gestoßen bin, habe ich Tabulatoren und Leerzeichen in meinem Editor irgendwie verwechselt.

Dana
quelle
13

Wenn Sie den IDLE-Editor von Python verwenden, können Sie wie in einer ähnlichen Fehlermeldung vorgeschlagen vorgehen:

1) Alle auswählen, zB Ctrl+A

2) Gehen Sie zu Format -> Region aufheben

3) Überprüfen Sie, ob Ihre Einrückung noch korrekt ist, speichern Sie Ihr Programm und führen Sie es erneut aus.

Ich benutze Python 2.5.4

Gatica
quelle
9

Wenn Sie Vim verwenden, drücken Sie die Esc-Taste und geben Sie ein

gg = G.

Dieses Auto rückt alles automatisch ein und räumt alle Räume auf, in die Sie geworfen haben.

cbartondock
quelle
8

Die Zeile: result = result * isollte eingerückt sein (dies ist der Hauptteil der for-Schleife).

Oder - Sie haben gemischte Leerzeichen und Tabulatorzeichen

Abgan
quelle
Ich musste die Bearbeitung in SO ändern, seltsam. Siehe meine aktualisierte "Bearbeiten"
-Notiz
Ok, also ich glaube, dass die zweite Zeile meiner Antwort richtig ist - Sie haben gemischte Leerzeichen und Tabulatorzeichen (32 bzw. 8 in ASCII)
Abgan
5

Auf Atom

gehe zu

Packages > Whitespace > Convert Spaces to Tabs

Überprüfen Sie dann erneut den Einzug Ihrer Datei:

python -m tabnanny yourFile.py

oder

>python
>>> help("yourFile.py")
loretoparisi
quelle
4

Scheint ein Einrückungsproblem zu sein. Sie müssen in Python keine geschweiften Klammern verwenden, aber Sie müssen den Einrückungsstufen entsprechen.

Der beste Weg, um Platz- / Tabulatorprobleme zu vermeiden, besteht darin, unsichtbare Zeichen in Ihrem Texteditor anzuzeigen. Auf diese Weise können Sie Einrückungsfehler schnell verhindern und / oder beheben.

Das Einfügen von kopiertem Code ist eine häufige Ursache für diese Art von Problem.

Matt Kahl
quelle
4

Wenn Sie Notepad ++ verwenden, führen Sie ein "Ersetzen" mit erweitertem Suchmodus durch, um \ t zu finden und durch vier Leerzeichen zu ersetzen.

Jackie Lee
quelle
2

Für Atom-Benutzer hat Packages ->whitspace -> remove trailing whitespaces dies bei mir funktioniert

Aha
quelle
2

Nur eine Ergänzung. Ich hatte ein ähnliches Problem mit den beiden Einrückungen in Notepad ++.

  1. Unerwünschte Einrückung
  2. Äußere Einrückungsstufe

    Gehen Sie zu ----> Registerkarte Suchen ----> tippen Sie auf Ersetzen ----> klicken Sie auf das Optionsfeld Erweitert unten ---> Ersetzen Sie nun \ t durch vier Leerzeichen

    Gehen Sie zu ----> Registerkarte Suchen ----> tippen Sie auf Ersetzen ----> klicken Sie auf das Optionsfeld Erweitert unten ---> Ersetzen Sie nun \ n durch nichts

JumpMan
quelle
2

Ich habe Jupyter Notebook verwendet und fast alle der oben genannten Lösungen (Anpassung an mein Szenario) ohne Verwendung ausprobiert. Ich ging dann Zeile für Zeile, löschte alle Leerzeichen für jede Zeile und ersetzte sie durch Tabulatoren. Das hat das Problem gelöst.

Cur123
quelle
2

Für Spyder-Benutzer gehen Sie zu Quelle> Einrückung korrigieren , um das Problem sofort zu beheben

Hafiz Abdulbasith
quelle
1

Dies kann daran liegen, dass die darüber liegende Funktion nicht auf die gleiche Weise eingerückt ist. dh

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")
Ali
quelle
1

Ich hatte gestern das gleiche Problem, es war ein Einrückungsfehler, ich habe einen großartigen Texteditor verwendet. Ich habe stundenlang versucht, das Problem zu beheben, und am Ende habe ich den Code in den VI-Texteditor kopiert, und es hat einwandfrei funktioniert. ps python ist zu weißraumempfindlich. Achten Sie darauf, Leerzeichen und Tabulatoren nicht zu mischen.

user3731311
quelle
1

Da ich es realisieren zu keiner Antwort spezifisch ist spyder, werde ich ein hinzufügen: Grundsätzlich sorgfältig auf Ihrer aussehen ifAussage und stellen Sie sicher , dass alle if, elifund elsehabe den gleichen Abstand , dass sie am Anfang wie so ist in der gleichen Zeile ist:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")
NelsonGon
quelle
1

Ich hatte eine Funktion definiert, aber sie hatte außer den Funktionskommentaren keinen Inhalt ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

Es schrie:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(Beachten Sie, dass die Linie, auf die die ^Markierung zeigt, leer ist.)

- -

Mehrere Lösungen:

1: Kommentieren Sie einfach die Funktion aus

2: Funktionskommentar hinzufügen

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: Fügen Sie eine Zeile hinzu, die nichts bewirkt

def foo(bar):
    0

Stellen Sie in jedem Fall sicher, dass klar ist, warum es sich um eine leere Funktion handelt - für Sie selbst oder für Ihre Kollegen, die Ihren Code verwenden

Cedric
quelle
Die Pass-Erklärung könnte dort nützlich sein :)
KevinG
1

Um Sie daran zu erinnern, dass ein logischer Fehler vorliegt, sollten Sie Ergebnis = 1 beibehalten. Andernfalls wird Ihre Ausgabe auch nach Ausführung der Schleife als Ergebnis = 0 angezeigt.

Zweitens können Sie es so schreiben:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

Wenn Sie eine Zeile verlassen, wird der Python-Shell mitgeteilt, dass die FOR-Anweisungen beendet wurden. Wenn Sie Erfahrung mit der Python-Shell haben, können Sie verstehen, warum wir eine Zeile hinterlassen müssen.

Faisal Ahmed Farooq
quelle
1

Für was es wert ist, wurde mein Docstring zu stark eingerückt und dies wirft auch den gleichen Fehler

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level

plfrick
quelle
Dies hat mein Problem
behoben
0

Dies liegt daran, dass sowohl Tabulatoren als auch Leerzeichen verwechselt werden. Sie können entweder alle Leerzeichen entfernen und durch Tabulatoren ersetzen.

Oder versuchen Sie Folgendes zu schreiben:

#!/usr/bin/python -tt

am Anfang des Codes. Diese Zeile löst alle Unterschiede zwischen Tabulatoren und Leerzeichen auf.

Eragon
quelle
0

In meinem Fall war das Problem die Konfiguration von Pydev auf Eclipse

pydev @ Eclipse

Rui Martins
quelle
0

Wenn Sie den Komodo-Editor verwenden, können Sie das tun, was in einer ähnlichen Fehlermeldung vorgeschlagen wird:

1) Wählen Sie alle aus, z. B. Strg + A.

2) Gehen Sie zu Code -> Region aufheben

3) Überprüfen Sie, ob Ihre Einrückung noch korrekt ist, speichern Sie Ihr Programm und führen Sie es erneut aus.

Ich benutze Python 3.4.2

Imtiaz Pabel
quelle
0

Wenn Sie Sublime-Text für die Python-Entwicklung verwenden, können Sie den Fehler vermeiden, indem Sie das Paket Anaconda verwenden. Nach der Installation von Anaconda

  1. Öffnen Sie Ihre Datei in erhaben
  2. Rechtsklick auf die Freiflächen
  3. wähle anaconda
  4. Klicken Sie auf Autoformat
  5. FERTIG Oder drücken Sie STRG + ALT + R.
Kapilfreeman
quelle
0

In Intellij mit dem Python-Plugin wurde das Problem mit Einzug / Tabulator / Leerzeichen durch Strg + Umschalt + Alt zum Neuformatieren des Dokuments behoben

Rene Ferguson
quelle
0

Für SPYDER- Benutzer: Ich verwende Spyder 3.3.2 mit Python 3.7.1 und habe dieses Problem gelöst, indem ich den Einzug so eingestellt habe, dass Registerkarten verwendet werden. Klicken Sie mit den folgenden Schritten auf:

  • Werkzeuge.
  • Einstellungen.
  • Editor.
  • Erweiterte Einstellungen.
  • Einrückungszeichen -> Tabulatoren.

Dann habe ich die "nicht identifizierte" Zeile mit der Tabulatortaste zurückgesetzt.

Aus irgendeinem Grund bekam ich ohne diese Einstellung manchmal den Ghost IndentationError.

Mike
quelle
0

Zum Beispiel:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

In diesem Code trat die gleiche Situation für mich auf. Löschen Sie einfach die vorherigen Einrückungsfelder in Zeile 2 und 3 und verwenden Sie dann entweder die Registerkarte oder das Leerzeichen. Verwenden Sie niemals beide . Geben Sie beim Schreiben von Code in Python den richtigen Einzug. Für Spyder gehe zu Quelle> Einrückung korrigieren. Gleiches gilt für VC-Code und erhabenen Text oder einen anderen Editor. Korrigieren Sie die Einrückung.

Ayush Aryan
quelle
-6

Dies geschieht hauptsächlich aufgrund des Editors. Versuchen Sie, Tabulatoren in Leerzeichen zu ändern (4). Die beste pythonfreundliche IDE oder die besten Editoren sind pycharm, sublime, vim für Linux.
Auch ich hatte das gleiche Problem, später stellte ich fest, dass es ein Codierungsproblem gibt. Ich schlage vor, Sie ändern auch Ihren Editor.

Yunus
quelle