Cosa fare con "Rientro imprevisto" in Python?


117

Come posso correggere l'errore "rientro imprevisto" in Python?


4
Un frammento di codice che produce l'errore ci aiuterà a capire meglio il tuo problema. Modifica la tua domanda per includere del codice.
RBerteig

7
Mi sembra un problema di spazi bianchi, quindi un esempio di codice sarebbe inutile.
James McMahon

Domanda vaga e nessuna risposta scelta.
rafael.js

"Come correggo l'errore ..."? Identificando dove si è verificato e risolvendo la causa dell'errore. In questo caso, facendo sembrare il rientro di quella particolare riga quello che Python si aspetta ...
twalberg

Risposte:


132

Python usa la spaziatura all'inizio della riga per determinare l'inizio e la fine dei blocchi di codice. Gli errori che puoi ottenere sono:

Rientro imprevisto. Questa riga di codice ha più spazi all'inizio di quella precedente, ma quella prima non è l'inizio di un sottoblocco (ad esempio if / while / for statement). Tutte le righe di codice in un blocco devono iniziare esattamente con la stessa stringa di spazi. Per esempio:

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

Questo è particolarmente comune quando si esegue Python in modo interattivo: assicurati di non inserire spazi aggiuntivi prima dei tuoi comandi. (Molto fastidioso quando si copia e incolla il codice di esempio!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent non corrisponde ad alcun livello di rientro esterno. Questa riga di codice ha meno spazi all'inizio di quella precedente, ma ugualmente non corrisponde a nessun altro blocco di cui potrebbe far parte. Python non può decidere dove andare. Ad esempio, di seguito, la stampa finale dovrebbe far parte della clausola if o no?

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

Previsto un blocco rientrato. Questa riga di codice ha lo stesso numero di spazi all'inizio di quella precedente, ma l'ultima riga doveva iniziare un blocco (ad esempio if / while / for istruzione, definizione di funzione).

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

Se si desidera una funzione che non fa nulla, utilizzare il "no-op" Comando passaggio :

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

È consentito combinare tabulazioni e spazi (almeno sulla mia versione di Python), ma Python presume che le tabulazioni siano lunghe 8 caratteri, che potrebbero non corrispondere al tuo editor. Dì solo "no" alle schede. La maggior parte degli editor consente che vengano sostituiti automaticamente da spazi.

Il modo migliore per evitare questi problemi è usare sempre un numero consistente di spazi quando indentate un sottoblocco e idealmente utilizzare un buon IDE che risolva il problema per voi. Ciò renderà anche il tuo codice più leggibile.


7
buona spiegazione. Oltre a ciò, ho anche speso il rientro Errore imprevisto quando ha mescolato gli spazi con "tab" e "barra spaziatrice" in NotePad ++, ha sostituito la "scheda" per "spazi" e risolto.
José Rosas Sáenz

2
@ JoséRosasSáenz Il tuo commento mi ha salvato così tanti problemi
user3726345

Un'altra causa è la mancata exceptparte di una tryclausola. Il codice sembra corretto (in quanto la riga non rientrata è pensata per essere fuori dal tryblocco) ma Python lo segnala come un errore di "rientro imprevisto". Il exceptpass
problema

@dumbledad Su quale versione di Python lo vedi? Quando provo il mio (sia 2.7.15 che 3.6.8), ottengo un SyntaxError
Alice Purcell

Ho riscontrato questo errore durante la copia / incolla del codice da un sito Web. Il posizionamento sembrava ok ma avevo bisogno di rimuovere lo spazio bianco e riapplicarlo usando gli spazi prima che QGIS (3.10) eseguisse il codice.
benj

23

In Python, la spaziatura è molto importante, questo fornisce la struttura dei blocchi di codice. Questo errore si verifica quando si confonde la struttura del codice, ad esempio in questo modo:

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

Potresti anche avere una combinazione di tabulazioni e spazi nel tuo file.

Ti suggerisco di utilizzare un editor sensibile alla sintassi Python come PyScripter o Netbeans


1
Sì, usa sicuramente editor compatibili con python! Ho avuto un problema durante la modifica in Blocco note ++ con le impostazioni predefinite e gli spazi bianchi erano sbagliati
Dave Archer,

2
tabulazioni e spazi misti sollevano "SyntaxError: uso incoerente di tabulazioni e spazi nel rientro"
SilentGhost

Proprio come un avvertimento, il plugin Python Netbeans attualmente non converte le tabulazioni in spazi dal codice esistente. Tuttavia, lo farà mentre scrivi nuovo codice.
James McMahon

PyCharm può convertirlo in modo coerente. Inoltre evidenzierà le linee in "colpa". Uso le virgolette perché non siamo negli anni '60 e non riesco a credere che un linguaggio meraviglioso come Python abbia ancora questo difetto cerebrale e che fa perdere tempo.
Echelon

Ho involontariamente cambiato editor a metà della scrittura del mio codice e ha riempito i miei rientri nel codice più recente. Il cambiamento non era evidente agli occhi, ma l'interprete non avrebbe eseguito il mio codice. Questo post mi ha aiutato a trovare il problema.
Lucien Stals

21

Esegui il tuo codice con l'opzione -tt per scoprire se stai usando tabulazioni e spazi in modo incoerente


16

Attiva gli spazi bianchi visibili nell'editor che stai utilizzando e attiva la sostituzione delle tabulazioni con spazi.

Sebbene sia possibile utilizzare le schede con Python mescolare le schede e lo spazio di solito porta all'errore che stai riscontrando. La sostituzione delle tabulazioni con 4 spazi è l'approccio consigliato per scrivere codice Python.


1
In che modo lo fai nello specifico? Sto usando Sublime.
chibole

8

Utilizzando il rientro corretto. Python riconosce gli spazi, quindi devi seguire le sue linee guida per l'indentazione per i blocchi o otterrai errori di indentazione.


6

Se stai scrivendo Python usando Sublime e ricevi errori di rientro,

visualizza -> rientro -> converti il ​​rientro in spazi

Il problema che sto descrivendo è causato dall'editor di testo Sublime. Lo stesso problema potrebbe essere causato anche da altri editor. Essenzialmente, il problema ha a che fare con Python che vuole trattare i rientri in termini di spazi rispetto a vari editor che codificano i rientri in termini di tabulazioni.


oh ... quindi sublime sta causando questo?
Nitin

Sì, il problema che sto descrivendo è causato da Sublime. Potrebbe essere causato anche da altri editori. Essenzialmente, il problema ha a che fare con Python che vuole trattare i rientri in termini di spazi rispetto a vari editor che codificano i rientri in termini di tabulazioni.
Puneet Lamba

Ho avuto lo stesso problema con Notepad ++. Ciò che ha incontrato gli occhi è vero, quindi ci è voluto del tempo per risolverlo. Ho dovuto spostare il cursore un carattere alla volta per capire che l'editor aveva convertito alcuni spazi bianchi in tabulazioni
Bharat Anand

4

Assicurati di utilizzare l'opzione "inserisci spazi invece di tabulazioni" nel tuo editor. Quindi puoi scegliere se desideri una larghezza di tabulazione, ad esempio 4. Puoi trovare queste opzioni in gedit sotto modifica -> preferenze -> editor.

linea di fondo: USA SPAZI non tabulazioni


La tua linea di fondo ha fatto il trucco!
Nick Div

3

Questo errore può verificarsi anche quando si incolla qualcosa nell'interprete Python (terminale / console).

Nota che l'interprete interpreta una riga vuota come la fine di un'espressione, quindi se incolli qualcosa come

def my_function():
    x = 3

    y = 7

l'interprete interpreterà la riga vuota prima y = 7come la fine dell'espressione, cioè che hai finito di definire la tua funzione, e la riga successiva - y = 7avrà un rientro errato perché è una nuova espressione.


fondamentale è che le righe vuote all'interno della definizione della funzione vanno bene, ma devono comunque avere lo spazio bianco iniziale poiché Python interpreta qualsiasi riga vuota come la fine della funzione
MichaelChirico

3

Un problema che non sembra essere stato menzionato è che questo errore può sorgere a causa di un problema con il codice che non ha nulla a che fare con il rientro.

Ad esempio, prendi il seguente script:

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

Ciò restituisce IndentationError: unexpected unindentquando il problema è ovviamente except:un'istruzione mancante .

Il mio punto: controlla il codice sopra dove viene segnalato il rientro inaspettato!


2

Se il rientro sembra a posto, dai un'occhiata per vedere se il tuo editor ha un'opzione "Visualizza spazi bianchi". Abilitare questo dovrebbe consentire di trovare dove sono mescolati spazi e tabulazioni.


2

C'è un trucco che ha sempre funzionato per me:

Se hai un rientro imprevisto e vedi che tutto il codice è perfettamente rientrato, prova ad aprirlo con un altro editor e vedrai quale riga di codice non è rientrata.

Mi è successo quando ho usato vim, gedit o editor del genere.

Prova a utilizzare solo 1 editor per il tuo codice.


2

Copia semplicemente lo script e metti sotto "" "l'intero codice" "" ...

specifica questa riga in una variabile .. come,

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..

ora esegui questo codice, nell'editor Sublime usando ctrl + b, ora stamperà il codice rientrato nella console. questo è tutto


come eseguirò il mio codice. Dovrò rimuovere "" "e" "" e la stampa a. Sostituirla ed eseguirla normalmente?
chibole

nessuna "" "" "" (virgolette triple) fa riferimento al contenuto invece che alla stringa. è obbligatorio perché il codice potrebbe contenere una stringa
composta

2

Tutto quello che devi fare è rimuovere spazi o tabulazioni dall'inizio dei seguenti codici

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

Esegui il seguente comando per risolverlo:

autopep8 -i <filename>.py

Questo aggiornerà il tuo codice e risolverà tutti gli errori di indentazione :)

Spero che questo risolva


Molto facile da implementare. Funziona per me ogni volta, ecco perché ho condiviso, si spera, sarà utile per qualcuno :)
Sharyar Vohra

1

Notepad ++ stava dando lo spazio di tabulazione corretto, ma il problema del rientro è stato finalmente trovato nell'editor di testo Sublime.

Usa l'editor di testo Sublime e vai riga per riga


0

Il rientro in Python è importante e questo non è solo per la leggibilità del codice, a differenza di molti altri linguaggi di programmazione. Se c'è uno spazio bianco o una tabulazione nel codice tra comandi consecutivi, python darà questo errore poiché Python è sensibile a questo. È probabile che riceviamo questo errore quando copiamo e incolliamo il codice su qualsiasi Python. Assicurati di identificare e rimuovere questi spazi utilizzando un editor di testo come Notepad ++ o rimuovi manualmente gli spazi bianchi dalla riga di codice in cui ricevi un errore.

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]]

Grazie!

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.