O que fazer com “recuo inesperado” em python?

117

Como retifico o erro "indentação inesperada" no python?

Ventilador Macintosh
fonte
4
Um fragmento de código que produz o erro nos ajudará a entender melhor seu problema. Edite sua pergunta para incluir algum código.
RBerteig
7
Isso soa como um problema de espaço em branco para mim, então um exemplo de código seria inútil.
James McMahon
Pergunta vaga e nenhuma resposta escolhida.
rafael.js
"Como retifico o erro ..."? Identificando onde ocorreu e corrigindo a causa do erro. Nesse caso, fazendo com que o recuo dessa linha em particular pareça o que o Python está esperando ...
twalberg

Respostas:

132

Python usa espaçamento no início da linha para determinar quando os blocos de código começam e terminam. Os erros que você pode obter são:

Recuo inesperado. Esta linha de código tem mais espaços no início do que a anterior, mas a anterior não é o início de um sub-bloco (por exemplo, instrução if / while / for). Todas as linhas de código em um bloco devem começar exatamente com a mesma string de espaço em branco. Por exemplo:

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

Este é especialmente comum ao executar python interativamente: certifique-se de não colocar nenhum espaço extra antes de seus comandos. (Muito irritante ao copiar e colar o código de exemplo!)

>>>   print "hello"
IndentationError: unexpected indent

Desfazer recuo não corresponde a nenhum nível de recuo externo. Esta linha de código tem menos espaços no início do que a anterior, mas também não corresponde a nenhum outro bloco do qual poderia fazer parte. Python não consegue decidir para onde vai. Por exemplo, a seguir, a impressão final deve ser parte da cláusula if, ou não?

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

Esperava um bloco indentado. Esta linha de código tem o mesmo número de espaços no início que a anterior, mas a última linha era esperada para iniciar um bloco (por exemplo, instrução if / while / for, definição de função).

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

Se você quiser uma função que não faça nada, use a passagem de comando "no-op" :

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

Misturar tabulações e espaços é permitido (pelo menos na minha versão do Python), mas Python assume que as tabs têm 8 caracteres, o que pode não corresponder ao seu editor. Basta dizer "não" às guias. A maioria dos editores permite que eles sejam substituídos automaticamente por espaços.

A melhor maneira de evitar esses problemas é sempre usar um número consistente de espaços ao indentar um subbloco e, de preferência, usar um bom IDE que resolva o problema para você. Isso também tornará seu código mais legível.

Alice Purcell
fonte
7
boa explicação. Além disso, também passei indent Erro inesperado quando ele misturou espaços com 'tab' e 'barra de espaço' no NotePad ++, substitua a 'tab' por 'espaços' e corrigiu.
José Rosas Sáenz
2
@ JoséRosasSáenz Seu comentário me salvou de tantos problemas
user3726345
Uma causa adicional é a omissão de exceptparte de uma trycláusula. O código parece correto (no sentido de que a linha sem tryrecuo deve estar fora do bloco), mas o Python relata isso como um erro de 'recuo inesperado'. Isso é corrigido adicionando except, talvez usando pass(como aqui )
dumbledad
@dumbledad Em qual versão do python você vê isso? Quando tento o meu (2.7.15 e 3.6.8), obtenho um SyntaxError
Alice Purcell
Encontrei este erro ao copiar / colar o código de um site. O posicionamento parecia ok, mas eu precisava remover o espaço em branco e reaplicar usando espaços antes que o QGIS (3.10) executasse o código.
benj
23

Em Python, o espaçamento é muito importante, pois dá a estrutura de seus blocos de código. Este erro ocorre quando você bagunça sua estrutura de código, por exemplo:

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

Você também pode ter uma mistura de tabulações e espaços em seu arquivo.

Eu sugiro que você use um editor com reconhecimento de sintaxe python, como PyScripter ou Netbeans

yanjost
fonte
1
Sim, definitivamente use editores com reconhecimento de python! Eu tive um problema onde estava editando no notepad ++ com as configurações padrão e estava obtendo o espaço em branco errado
Dave Archer
2
tabulações e espaços mistos geram "SyntaxError: uso inconsistente de tabulações e espaços em indentação"
SilentGhost
Apenas como uma advertência, o plug-in Python Netbeans atualmente não converte guias em espaços do código existente. No entanto, ele fará isso conforme você escreve o novo código.
James McMahon
PyCharm pode convertê-lo de forma consistente. Também irá destacar as linhas em "falha". Eu uso aspas porque não estamos nos anos 1960 e não posso acreditar que uma linguagem maravilhosa como o Python ainda tenha essa falha de morte cerebral e perda de tempo.
Echelon
Eu involuntariamente troquei de editores no meio do caminho de escrever meu código e isso enchi meus recuos no código mais recente. A mudança não era óbvia à vista, mas o intérprete não executou meu código. Este post me ajudou a encontrar o problema.
Lucien Stals
21

Execute seu código com a opção -tt para descobrir se você está usando tabulações e espaços de forma inconsistente

Manoj I
fonte
16

Ative os espaços em branco visíveis em qualquer editor que você esteja usando e ative substituir tabulações por espaços.

Embora você possa usar guias com Python, misturar guias e espaço geralmente leva ao erro que está ocorrendo. Substituir as guias por 4 espaços é a abordagem recomendada para escrever código Python.

James McMahon
fonte
1
Como você faz isso especificamente? Estou usando o Sublime.
chibole
8

Usando recuo correto. Python reconhece espaços em branco, então você precisa seguir suas diretrizes de indentação para blocos ou obterá erros de indentação.

workmad3
fonte
6

Se você está escrevendo Python usando Sublime e recebendo erros de indentação,

visualizar -> recuo -> converter recuo em espaços

O problema que estou descrevendo é causado pelo editor de texto Sublime. O mesmo problema pode ser causado por outros editores também. Essencialmente, o problema tem a ver com o Python querer tratar indentações em termos de espaços versus vários editores codificando as indentações em termos de guias.

Puneet Lamba
fonte
oh ... então é sublime causando isso?
nitin
Sim, o problema que estou descrevendo é causado pelo Sublime. Pode ser causado por outros editores também. Essencialmente, o problema tem a ver com o Python querer tratar indentações em termos de espaços versus vários editores codificando as indentações em termos de guias.
Puneet Lamba
Eu tive o mesmo problema com o notepad ++. O que parecia ser verdade, demorou algum tempo para decifrar isso. Tive que mover o cursor um caractere por vez para descobrir que o editor havia convertido alguns espaços em branco em guias
Bharat Anand
4

Certifique-se de usar a opção "inserir espaços em vez de tabulações" em seu editor. Em seguida, você pode escolher que deseja uma largura de tabulação, por exemplo 4. Você pode encontrar essas opções no gedit em editar -> preferências -> editor.

linha inferior: USE ESPAÇOS, não guias

Alex
fonte
Sua linha de fundo fez o truque!
Nick Div
3

Este erro também pode ocorrer ao colar algo no interpretador Python (terminal / console).

Observe que o interpretador interpreta uma linha vazia como o final de uma expressão, então se você colar algo como

def my_function():
    x = 3

    y = 7

o intérprete interpretará a linha vazia anterior y = 7como o fim da expressão, ou seja, que você acabou de definir sua função, e a próxima linha - y = 7terá recuo incorreto porque é uma nova expressão.

Zoltán
fonte
chave sendo que as linhas em branco dentro da definição da função estão bem, mas eles ainda devem ter o espaço em branco inicial, já que o Python interpreta qualquer linha em branco como o final da função
MichaelChirico
3

Um problema que parece não ter sido mencionado é que esse erro pode surgir devido a um problema com o código que não tem nada a ver com indentação.

Por exemplo, pegue o seguinte script:

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

Isso retorna um IndentationError: unexpected unindentquando o problema é, obviamente, uma except:instrução ausente .

Meu ponto: verifique o código acima onde o inesperado (des) recuo é relatado!

WMoreland
fonte
2

Se a indentação parecer correta, verifique se o seu editor possui a opção "Exibir espaços em branco". Ativar isso deve permitir encontrar onde os espaços e as tabulações estão misturados.


fonte
2

Existe um truque que sempre funcionou para mim:

Se você obteve um recuo inesperado e vê que todo o código está perfeitamente recuado, tente abri-lo com outro editor e você verá qual linha de código não está recuada.

Aconteceu comigo quando usei vim, gedit ou editores assim.

Tente usar apenas 1 editor para o seu código.

Jesus Rodriguez
fonte
2

Simplesmente copie seu script e coloque em "" "todo o seu código" "" ...

especifique esta linha em uma variável .. como,

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

agora execute este código, no Sublime Editor usando ctrl + b, agora ele irá imprimir o código indentado no console. é isso aí

Mohideen bin Mohammed
fonte
como irei executar meu código. Terei que remover o "" "e" "" e a impressão a.replace e executá-la normalmente?
chibole
não "" "" "" (aspas triplas) referem-se ao seu conteúdo em vez de string. é obrigatório porque seu código pode conter uma string com aspas simples / duplas, portanto, "" "obrigatório.
Mohideen bin Mohammed
2

Tudo que você precisa fazer é remover os espaços ou espaços de tabulação do início dos seguintes códigos

from django.contrib import admin

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

Execute o seguinte comando para resolvê-lo:

autopep8 -i <filename>.py

Isso irá atualizar seu código e resolver todos os erros de indentação :)

Espero que isso resolva

Sharyar Vohra
fonte
Muito fácil de implementar. Funciona para mim todas as vezes, é por isso que compartilhei, espero que seja benéfico para alguém :)
Sharyar Vohra
1

O Notepad ++ estava fornecendo o espaço da tabulação correto, mas o problema de indentação foi finalmente encontrado no editor de texto Sublime.

Use o editor de texto Sublime e siga linha por linha

HimalayanCoder
fonte
0

O recuo em Python é importante e não apenas para legibilidade do código, ao contrário de muitas outras linguagens de programação. Se houver algum espaço em branco ou tabulação em seu código entre comandos consecutivos, o python apresentará esse erro, pois o Python é sensível a isso. Provavelmente receberemos esse erro ao copiar e colar o código em qualquer Python. Certifique-se de identificar e remover esses espaços usando um editor de texto como o Notepad ++ ou remova manualmente o espaço em branco da linha de código onde você está obtendo um erro.

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

Obrigado!

Ashu Kr
fonte