IndentationError: unindent non corrisponde a nessun livello di indentazione esterno


585

Quando compilo il codice Python qui sotto, ottengo

IndentationError: unindent non corrisponde a nessun livello di indentazione esterno


import sys

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

Perché?


7
e probabilmente l'intervallo (1, n + 1) sarà migliore, se vuoi includere 'n' nel tuo calcolo :-)
Abgan,

7
Ho avuto lo stesso errore, ma mi è capitato di indentare un metodo molto in alto nel codice leggermente a sinistra, che ha dato questo errore in fondo al metodo successivo dopo di esso. Quindi questo errore può verificarsi non solo mescolando schede e spazi.
contratto del Prof. Falken è stato violato il

14
Sto usando Sublime Text 3. Ho un progetto Django. Ho corretto l'errore usandoView > Indentation > Intent Using Spaces
AbhimanyuAryan

Aveva questo problema in Pycharm, la regolazione delle schede e la spaziatura nelle configurazioni non funzionava. Il problema era che avevo un file ~ / .editorconfig che sovrascriveva la configurazione di Pycharm.
Ken Myers,

Ho scoperto che utilizzando IDLE è molto più facile trovare problemi di rientro. Troverà chiaramente errori di rientro che la maggior parte degli editor non troverà.
Dennis Gathagu,

Risposte:


670

Altri poster sono probabilmente corretti ... potrebbero esserci spazi mescolati con le tue schede. Prova a fare una ricerca e sostituisci per sostituire tutte le schede con pochi spazi.

Prova questo:

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)

2
sì, ho dovuto davvero spaziare sulla parte interna del loop nelle ultime due righe (solo in SO). Non so perché ...
cbrulak,

3
la mia prima riga, "risultato = 0" (che avrebbe dovuto essere 1, grazie per la correzione) era spaziata mentre il resto era a schede, dannazione, non sapevo che il pitone fosse così
cbrulak,

1
Sì, può essere difficile. Uso emacs per modificare Python e l'ho configurato per sostituire sempre le schede con spazi nei file PY, quindi non ho questo problema. Notepad ++ potrebbe avere anche un'opzione come questa.
Kevin Tighe,

3
Ho lo stesso problema atm :). SublimeText mostra gli spazi come punti, è piuttosto utile.
Kris,

Quindi tieni duro puoi rientrare con spazi O schede. devi solo essere coerente? sbatte la testa
David

265

IMPORTANTE : Gli spazi sono il metodo preferito - vedi PEP008 Rientro e tabulazioni o spazi? . (Grazie a @Siha per questo.)

Per gli Sublime Textutenti:

Impostare Sublime Textper utilizzare le schede per il rientro: View-> Indentation->Convert Indentation to Tabs

Deseleziona l' Indent Using Spacesopzione anche nello stesso sottomenu sopra. Questo risolverà immediatamente questo problema.


1
Inoltre ogni volta che utilizzando Python, assicuratevi di impostare un'opzione simile in qualsiasi IDE / Editor di testo si usa
activatedgeek

20
Anche su ATOM, Pacchetti> Spazio bianco> Converti spazi in schede e eviterai un mal di testa con errore di sintassi di Python!
Loretoparisi,

1
Gli spazi sono il metodo preferito - vedi PEP008 Rientro e tabulazioni o spazi? . Sublime può anche essere configurato per farlo in questo modo.
SiHa,

13
dici che gli spazi sono il metodo preferito, ma la tua risposta chiede alle persone di chiedere al sublime di usare le schede! Sono confuso
gota,

@NunoCalaim Beh, sfortunatamente, è successo dopo che avevo risposto alla domanda. Se stai iniziando un nuovo progetto, utilizza la tecnica preferita degli spazi. Ecco perché ho apportato una modifica in grassetto in modo che tutti i nuovi arrivati ​​siano a conoscenza del disclaimer.
activatedgeek

137

Per verificare facilmente la presenza di problemi con schede / spazi, puoi effettivamente farlo:

python -m tabnanny yourfile.py

o puoi semplicemente impostare il tuo editor in modo corretto ovviamente :-)


1
Ho provato questo in un file con qualche errore di rientro tab / space, ma nessun output con un file tab errato. qualche idea?
Luchux,

1
Ho avuto un problema con gli spazi e l'errore diceva che era sulla linea 191, ma grazie a tabnanny ho scoperto che il vero problema non era su quella linea, ma nella riga sopra.
richar8086,

Grazie! Che grande consiglio. L'errore è stato identificato da flake8 in VS Code ma non è stato in grado di identificare dove si trovasse il problema - tabnanny lo ha fatto in un microsecondo.
Steve,

39

Sei sicuro di non mescolare schede e spazi nel tuo spazio bianco di rientro? (Ciò causerà quell'errore.)

Nota, si consiglia di non utilizzare le schede nel codice Python. Vedi la guida di stile . È necessario configurare Notepad ++ per inserire spazi per le schede.


Non ho capito bene. La risposta sopra afferma di cambiare un'opzione dell'editor di testo per utilizzare le schede anziché gli spazi.
spurra,

3
@BananaCode Fintanto che usi SOLO schede o SOLO spazi, tecnicamente non importa quale scegli. Sebbene per Python, gli spazi siano preferiti, vedere il collegamento a cui mi riferivo.
zdan,

21

Ogni volta che ho riscontrato questo errore, è perché in qualche modo ho confuso schede e spazi nel mio editor.


13

Se usi l'editor IDLE di Python puoi fare come suggerisce in uno dei messaggi di errore simili:

1) selezionare tutto, ad es. Ctrl+A

2) Vai a Formato -> Untabify Region

3) Controlla nuovamente che il rientro sia ancora corretto, salva ed esegui nuovamente il programma.

Sto usando Python 2.5.4


9

Se stai usando Vim, premi Esc e poi digita

gg = G

Questo rientro automatico di tutto e cancella tutti gli spazi in cui sei stato lanciato.


8

La linea: result = result * idovrebbe essere rientrata (è il corpo del for-loop).

Oppure: hai spazi misti e caratteri di tabulazione


Ho dovuto modificare il montaggio in SO, strano. Vedi la mia nota "Modifica" aggiornata nella domanda
cbrulak

Ok, quindi credo che la seconda riga della mia risposta sia corretta - hai spazi misti e caratteri di tabulazione (rispettivamente 32 e 8 in ASCII)
Abgan

5

Su Atom

vai a

Packages > Whitespace > Convert Spaces to Tabs

Quindi controllare nuovamente il rientro del file:

python -m tabnanny yourFile.py

o

>python
>>> help("yourFile.py")

4

Sembra essere un problema di rientro. Non si deve necessariamente corrispondere parentesi graffe in Python ma non devono corrispondere livelli di rientro.

Il modo migliore per prevenire problemi di spazio / tabulazione è visualizzare caratteri invisibili all'interno dell'editor di testo. Ciò fornirà un modo rapido per prevenire e / o risolvere errori relativi al rientro.

Inoltre, l'iniezione di codice incollato è una fonte comune per questo tipo di problema.


4

Se usi notepad ++, esegui una "sostituzione" con la modalità di ricerca estesa per trovare \ t e sostituire con quattro spazi.


2

per gli utenti Atom, Packages ->whitspace -> remove trailing whitespaces questo ha funzionato per me


2

Solo un'aggiunta. Ho avuto un problema simile con entrambe le rientranze in Notepad ++.

  1. Rientro inesatto
  2. Livello di rientro esterno

    Vai a ----> scheda Cerca ----> tocca Sostituisci ----> premi il pulsante di opzione Esteso sotto ---> Ora sostituisci \ t con quattro spazi

    Vai a ----> scheda Cerca ----> tocca Sostituisci ----> premi il pulsante di opzione Esteso sotto ---> Ora sostituisci \ n con niente


2

Stavo usando il notebook Jupyter e ho provato quasi tutte le soluzioni di cui sopra (adattandomi al mio scenario) inutilmente. Poi sono andato riga per riga, cancellato tutti gli spazi per ogni riga e sostituito con tab. Ciò ha risolto il problema.


2

Per gli utenti di Spyder vai a Sorgente> Correggi rientro per risolvere immediatamente il problema


1

Potrebbe essere perché la funzione sopra non è rientrata allo stesso modo. vale a dire

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

1

Ho avuto lo stesso problema ieri, era un errore di rientro, usavo un editor di testo sublime. ho impiegato ore a cercare di risolverlo e alla fine ho finito per copiare il codice nell'editor di testo VI e ha funzionato bene. ps python è troppo sensibile agli spazi bianchi, assicurati di non mescolare spazio e tabulazione.


1

Dal momento che mi rendo conto che non c'è una risposta specifica spyder, ne aggiungerò una: Fondamentalmente, guarda attentamente la tua ifaffermazione e assicurati di tutto if, elife elsehanno la stessa spaziatura che sono nella stessa linea all'inizio in questo modo:

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!")

1

Avevo una funzione definita, ma non aveva alcun contenuto a parte i commenti sulla funzione ...

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

Ha urlato:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(nota che la linea a cui ^punta il segno è vuota)

-

Molteplici soluzioni:

1: basta commentare la funzione

2: Aggiungi commento funzione

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

3: Aggiungi una linea che non fa nulla

def foo(bar):
    0

In ogni caso, assicurati di rendere ovvio il motivo per cui è una funzione vuota - per te o per i tuoi colleghi che useranno il tuo codice


L' istruzione pass potrebbe essere utile lì :)
KevinG

1

In primo luogo, solo per ricordare che c'è un errore logico, è meglio mantenere risultato = 1 altrimenti l'output sarà risultato = 0 anche dopo l'esecuzione del ciclo.

In secondo luogo puoi scriverlo in questo modo:

import sys

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

  print "factorial is ",result
  return result

Lasciare una riga dirà alla shell python che le istruzioni FOR sono terminate. Se hai esperienza nell'uso della shell Python, puoi capire perché dobbiamo lasciare una riga.


1

Per quello che vale, la mia dotstring è stata troppo rientrata e anche questo genera lo stesso errore

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

IndentationError: unindent does not match any outer indentation level


questo risolto il mio problema
bhordupur

0

Questo perché c'è un miscuglio di schede e spazi. Puoi rimuovere tutti gli spazi e sostituirli con le schede.

Oppure, prova a scrivere questo:

#!/usr/bin/python -tt

all'inizio del codice. Questa riga risolve eventuali differenze tra schede e spazi.


0

nel mio caso, il problema era la configurazione di pydev su Eclipse

pydev @ Eclipse


0

Se usi l'editor di Komodo puoi fare come suggerisce in uno dei messaggi di errore simili:

1) seleziona tutto, ad es. Ctrl + A

2) Vai a Codice -> Untabify Region

3) Controlla nuovamente che il rientro sia ancora corretto, salva ed esegui nuovamente il programma.

Sto usando Python 3.4.2


0

Se stai usando il testo Sublime per lo sviluppo di Python, puoi evitare l'errore usando il pacchetto Anaconda. Dopo aver installato Anaconda,

  1. apri il tuo file in sublime
  2. fare clic con il tasto destro del mouse sugli spazi aperti
  3. scegli anaconda
  4. fai clic su formattazione automatica
  5. FATTO O premere CTRL + ALT + R.

0

In intellij con plug-in Python, Ctrl + Maiusc + Alt per riformattare il documento risolto il problema rientro / tab / spazi


0

Per gli utenti SPYDER : sto usando Spyder 3.3.2 con Python 3.7.1 e ho risolto questo problema, impostando il rientro per usare le schede, con i seguenti passaggi, fare clic su:

  • Utensili.
  • Preferenze.
  • Editor.
  • Impostazioni avanzate.
  • Caratteri di rientro -> Schede.

Quindi ho resettato la riga "non identificata" usando il tasto tab.

Per qualche motivo, senza questa impostazione, a volte ho ricevuto il fantasma IndentationError.


0

Per esempio:

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

In questo codice si è verificata la stessa situazione per me. Elimina semplicemente gli spazi di rientro precedenti della riga 2 e 3, quindi utilizza la scheda o lo spazio. Non usare mai entrambi . Fornisci il rientro corretto durante la scrittura del codice in Python. Per Spyder goto Source> Correggi rientro. Lo stesso vale per il codice VC e il testo sublime o qualsiasi altro editor. Correggi il rientro.


-6

Ciò accade principalmente a causa dell'editor. Prova a cambiare le schede in spazi (4) .I migliori IDE o editor compatibili con Python sono pycharm, sublime, vim per linux.
anche se anch'io avevo riscontrato lo stesso problema, in seguito ho scoperto che esiste un problema di codifica. Suggerisco anche tu di cambiare il tuo editor.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.