IndentationError: unindent não corresponde a nenhum nível de recuo externo

585

Quando compilo o código Python abaixo, recebo

IndentationError: unindent não corresponde a nenhum nível de recuo externo


import sys

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

Por quê?

cbrulak
fonte
7
e provavelmente vão (1, n + 1) será melhor, se você quiser incluir 'n' em sua computação :-)
Abgan
7
Eu tive o mesmo erro, mas aconteceu de eu recuar um método caminho até no código ligeiramente para a esquerda, o que deu esse erro na parte inferior da próxima método depois. Portanto, esse erro pode ocorrer não apenas ao misturar guias e espaços.
O contrato do Prof. Falken violou
14
Estou usando o Sublime Text 3. Tenho um projeto Django. Corrigi o erro usando #View > Indentation > Intent Using Spaces
AbhimanyuAryan
Teve esse problema no pycharm, ajustar guias e espaçamento nas configurações não funcionou. O problema era que eu tinha um arquivo ~ / .editorconfig que estava substituindo a configuração do pycharm.
Ken Myers
Descobri que o uso do IDLE facilita muito a localização de problemas de indentação. Ele encontrará claramente erros de indentação que a maioria dos editores não encontrará.
Dennis Gathagu 16/01

Respostas:

669

Outros pôsteres provavelmente estão corretos ... pode haver espaços misturados às suas guias. Tente fazer uma pesquisa e substituir para substituir todas as guias por alguns espaços.

Tente o seguinte:

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
fonte
2
sim, eu tive que realmente espaçar a parte interna do loop nas duas últimas linhas (somente no SO). Não sei por que ...
cbrulak
3
minha primeira linha, "resultado = 0" (que deve ahve sido 1, obrigado por corrigir) foi espaçados, enquanto o resto foi tabulado, maldito, não sabia python era assim
cbrulak
1
Sim, isso pode ser complicado. Eu uso o emacs para editar python, e eu o tenho configurado para sempre substituir guias por espaços em arquivos py, para que não tenha esse problema. O Notepad ++ também pode ter uma opção como essa.
Kevin Tighe
3
Tem o mesmo problema atm :). SublimeText mostra espaços como pontos, é bastante útil.
Kris
Portanto, aguarde, você pode recuar com espaços OU guias. você só precisa ser consistente? bate cabeça
David
265

IMPORTANTE : Espaços são o método preferido - consulte Recuo PEP008 e Guias ou Espaços? . (Obrigado a @Siha por isso.)

Para Sublime Textusuários:

Defina Sublime Textpara usar guias para recuo: View-> Indentation->Convert Indentation to Tabs

Desmarque a Indent Using Spacesopção também no mesmo submenu acima. Isso resolverá imediatamente esse problema.

enabledgeek
fonte
1
Além disso, sempre utilizando Python, certifique-se de definir uma opção semelhante em qualquer IDE / Editor de Texto você usa
activatedgeek
20
Também no ATOM, Pacotes> Espaço em Branco> Converter Espaços em Guias e você evitará uma Dor de Cabeça com Erro de Sintaxe do Python!
31715 loretoparisi
1
Os espaços são o método preferido - consulte Recuo e divisões ou espaços PEP008 ? . O sublime também pode ser configurado para fazê-lo dessa maneira.
SiHa
13
você diz que os espaços são o método preferido, mas sua resposta pede que as pessoas solicitem sublime para usar guias em vez disso! Estou confuso
gota 07/07
@NunoCalaim Bem, infelizmente, isso aconteceu depois que eu respondi à pergunta. Se você está iniciando um novo projeto, use a técnica preferida de espaços. Foi por isso que fiz uma edição em negrito para que todos os recém-chegados fiquem cientes do aviso.
activatedgeek
137

Para verificar facilmente problemas com guias / espaços, você pode realmente fazer isso:

python -m tabnanny yourfile.py

ou você pode simplesmente configurar seu editor corretamente, é claro :-)

André
fonte
1
Eu tentei isso em um arquivo com algum erro de indentação de tabulação / espaço, mas nenhuma saída com um arquivo de tabulação incorreto. qualquer ideia?
Luchux
1
Eu tive um problema com espaços e o erro dizia que estava na linha 191, mas graças a tabnanny, descobri que o problema real não estava nessa linha, mas na linha acima.
Richar8086
Obrigado! Que ótima dica. O erro foi identificado por flake8 no VS Code, mas não conseguiu identificar onde estava o problema - tabnanny fez em um microssegundo.
Steve Steve
39

Tem certeza de que não está misturando tabulações e espaços no espaço em branco do recuo? (Isso causará esse erro.)

Observe que é recomendável não usar guias no código Python. Veja o guia de estilo . Você deve configurar o Notepad ++ para inserir espaços para guias.

zdan
fonte
Estou confuso. A resposta acima declara alternar uma opção do editor de texto para usar guias em vez de espaços.
Spurra
3
@BananaCode Desde que você use APENAS guias ou APENAS espaços, tecnicamente não importa qual você escolher. Embora para python, os espaços sejam preferidos, consulte o link ao qual me referi.
Zdan
21

Sempre que encontrei esse erro, é porque de alguma forma misturei guias e espaços no meu editor.

Dana
fonte
13

Se você usa o editor IDLE do Python, pode fazer o que sugere em uma das mensagens de erro semelhantes:

1) selecione tudo, por exemplo, Ctrl+A

2) Vá para Formatar -> Untabify Region

3) Verifique novamente se o recuo ainda está correto, salve e execute o programa novamente.

Estou usando o Python 2.5.4

Gatica
fonte
9

Se você estiver usando o Vim, pressione escape e digite

gg = G

Esse recuo automático tudo e limpará todos os espaços que você jogou dentro

cbartondock
fonte
8

A linha: result = result * ideve ser recuada (é o corpo do loop for).

Ou - você misturou caracteres de espaço e tabulação

Abgan
fonte
Eu tive que mudar a edição em SO, estranho. Ver o meu atualizados nota "Editar" na questão
cbrulak
Ok, então eu acredito que a segunda linha da minha resposta está correta - você tem caracteres de espaço e tabulação mistos (32 e 8 em ASCII, respectivamente)
Abgan
5

No Atom

vamos para

Packages > Whitespace > Convert Spaces to Tabs

Em seguida, verifique novamente o recuo do arquivo:

python -m tabnanny yourFile.py

ou

>python
>>> help("yourFile.py")
Loretoparisi
fonte
4

Parece ser um problema de recuo. Você não tem que coincidir com chaves em Python, mas você não tem que coincidir com níveis de recuo.

A melhor maneira de evitar problemas de espaço / tabulação é exibir caracteres invisíveis no seu editor de texto. Isso fornecerá uma maneira rápida de impedir e / ou resolver erros relacionados à indentação.

Além disso, a injeção de código copiado e colado é uma fonte comum para esse tipo de problema.

Matt Kahl
fonte
4

Se você usar o bloco de notas ++, faça uma "substituição" pelo modo de pesquisa estendida para encontrar \ te substitua por quatro espaços.

Jackie Lee
fonte
2

para usuários Atom, Packages ->whitspace -> remove trailing whitespaces isso funcionou para mim

Aha
fonte
2

Apenas uma adição. Eu tive um problema semelhante com os dois recuos no Notepad ++.

  1. Recuo inesperado
  2. Nível de recuo externo

    Ir para ----> guia Pesquisar ----> toque na substituir ----> acertar o botão de opção Extensão abaixo ---> Agora substitua \ t por quatro espaços

    Vá para ----> guia Pesquisar ----> toque em substituir ----> pressione o botão de rádio Estendido abaixo ---> Agora substitua \ n por nada

JumpMan
fonte
2

Eu estava usando o notebook Jupyter e tentei quase todas as soluções acima (adaptando-me ao meu cenário) sem utilidade. Depois fui linha por linha, excluí todos os espaços de cada linha e substitui por tab. Isso resolveu o problema.

Cur123
fonte
2

Para usuários do Spyder, vá para Fonte> Corrigir recuo para corrigir o problema imediatamente

Hafiz Abdulbasith
fonte
1

Pode ser porque a função acima não é recuada da mesma maneira. ie

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

Eu tive o mesmo problema ontem, foi um erro de indentação, estava usando o editor de texto sublime. levei minhas horas tentando consertá-lo e, no final, acabei copiando o código no editor de texto VI e funcionou bem. O ps python é muito sensível ao espaço em branco, não misture espaço e tabulação.

user3731311
fonte
1

Desde que eu percebo que não tenho resposta específica para spyder, vou acrescentar um: Basicamente, olhar cuidadosamente para a sua ifdeclaração e certificar-se de tudo if, elife elsetêm o mesmo espaçamento que é que eles estão na mesma linha no início da seguinte forma:

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
fonte
1

Eu tinha uma função definida, mas ela não tinha nenhum conteúdo além dos comentários sobre a função ...

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

Ele gritou:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(observe que a linha para a qual a ^marca aponta está vazia)

-

Várias soluções:

1: Apenas comente a função

2: Adicionar comentário de função

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

3: Adicione uma linha que não faz nada

def foo(bar):
    0

De qualquer forma, certifique-se de deixar claro por que é uma função vazia - para você ou seus colegas que usarão seu código

Cedric
fonte
A declaração passagem poderia ser útil lá :)
KevinG
1

Em primeiro lugar, apenas para lembrá-lo de que existe um erro lógico, é melhor você manter o resultado = 1 ou sua saída será resultado = 0 mesmo após a execução do loop.

Em segundo lugar, você pode escrever assim:

import sys

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

  print "factorial is ",result
  return result

Deixar uma linha informará ao shell python que as instruções FOR foram encerradas. Se você tem experiência no uso do shell python, pode entender por que temos que deixar uma linha.

Faisal Ahmed Farooq
fonte
1

Pelo que vale, minha docstring foi muito recuada e isso também gera o mesmo erro

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

IndentationError: unindent does not match any outer indentation level

plfrick
fonte
isso corrigiu o meu problema
bhordupur 29/03
0

Isso ocorre porque há uma mistura de guias e espaços. Você pode remover todos os espaços e substituí-los por guias.

Ou tente escrever o seguinte:

#!/usr/bin/python -tt

no início do código. Esta linha resolve quaisquer diferenças entre tabulações e espaços.

Eragon
fonte
0

no meu caso, o problema era a configuração do pydev no Eclipse

pydev @ Eclipse

Rui Martins
fonte
0

Se você usar o editor Komodo, poderá fazer o que sugere em uma das mensagens de erro semelhantes:

1) selecione tudo, por exemplo, Ctrl + A

2) Vá para Código -> Untabify Region

3) Verifique novamente se o recuo ainda está correto, salve e execute o programa novamente.

Estou usando o Python 3.4.2

Imtiaz Pabel
fonte
0

Se você estiver usando texto sublime para o desenvolvimento de python, poderá evitar o erro usando o pacote Anaconda. Depois de instalar o Anaconda,

  1. abra seu arquivo em sublime
  2. clique direito nos espaços abertos
  3. escolha anaconda
  4. clique em formatação automática
  5. OK ou pressione CTRL + ALT + R.
Kapilfreeman
fonte
0

Em intellij com o plugin python, Ctrl + Shift + Alt para reformatar o documento corrigiu o problema de indent / tab / spaces

Rene Ferguson
fonte
0

Para usuários do SPYDER : estou usando o spyder 3.3.2 com python 3.7.1 e resolvi isso, definindo o recuo para usar guias, com as seguintes etapas, clique em:

  • Ferramentas.
  • Preferências.
  • Editor.
  • Configurações avançadas.
  • Caracteres de recuo -> Guias.

Em seguida, redefino a linha "não identificada" usando a tecla Tab.

Por alguma razão, sem essa configuração, recebi o fantasma IndentationError algumas vezes.

Mike
fonte
0

Por exemplo:

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

Nesse código, a mesma situação ocorreu para mim. Apenas exclua os espaços de recuo anteriores das linhas 2 e 3 e use tab ou espaço. Nunca use os dois . Forneça recuo adequado ao escrever código em python. Para Spyder, vá para Fonte> Corrigir recuo. O mesmo vale para o VC Code e o texto sublime ou qualquer outro editor. Corrija o recuo.

Ayush Aryan
fonte
-6

Isso acontece principalmente por causa do editor. Tente alterar as guias para espaços (4). O melhor IDE ou editores amigáveis ​​para python são pycharm, sublime, vim para linux.
Mesmo que eu também tenha encontrado o mesmo problema, mais tarde descobri que há um problema de codificação. Sugiro que você também mude seu editor.

yunus
fonte