IndentationError: unindent no coincide con ningún nivel de sangría externa

585

Cuando compilo el código de Python a continuación, obtengo

IndentationError: unindent no coincide con ningún nivel de sangría externa


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
fuente
77
y probablemente el rango (1, n + 1) será mejor, si desea incluir 'n' en su cálculo :-)
Abgan
77
Tuve el mismo error, pero sucedió que sangré un método hacia arriba en el código ligeramente a la izquierda, lo que dio este error en la parte inferior del siguiente método después. Entonces, este error puede ocurrir no solo al mezclar pestañas y espacios.
contrato del Prof. Falken incumplió el
14
Estoy usando Sublime Text 3. Tengo un proyecto Django. Solucioné el error usandoView > Indentation > Intent Using Spaces
AbhimanyuAryan
Tuve este problema en pycharm, el ajuste de pestañas y el espaciado en las configuraciones no funcionaron. El problema era que tenía un archivo ~ / .editorconfig que anulaba la configuración de pycharm.
Ken Myers
Descubrí que usar IDLE hace que sea mucho más fácil encontrar problemas de sangría. Claramente encontrará errores de sangría que la mayoría de los editores no encontrarán.
Dennis Gathagu

Respuestas:

670

Otros carteles son probablemente correctos ... puede haber espacios mezclados con sus pestañas. Intente hacer una búsqueda y reemplazar para reemplazar todas las pestañas con unos pocos espacios.

Prueba esto:

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
fuente
2
Sí, tuve que espaciar realmente sobre la parte del bucle interno en las dos últimas líneas (solo en SO). No estoy seguro de por qué ...
cbrulak
3
mi primera línea "resultado = 0" (que debería haber existido sido 1, gracias por la corrección) se espaciados mientras que el resto fue pestañas, maldito, no sabía pitón era como que
cbrulak
1
Sí, eso puede ser complicado. Utilizo emacs para editar python, y lo tengo configurado para reemplazar siempre las pestañas con espacios en los archivos py, por lo que no tengo este problema. Notepad ++ también podría tener una opción como esta.
Kevin Tighe el
3
Tengo el mismo problema atm :). SublimeText muestra los espacios como puntos, es bastante útil.
Kris
Así que espera, puedes sangrar con espacios O pestañas. solo necesitas ser constante? golpea la cabeza
David
265

IMPORTANTE : los espacios son el método preferido ; consulte PEP008 Sangría y pestañas o espacios. . (Gracias a @Siha por esto).

Para Sublime Textusuarios:

Configurar Sublime Textpara usar pestañas para sangría: View-> Indentation->Convert Indentation to Tabs

Desactive la Indent Using Spacesopción también en el mismo submenú anterior. Esto resolverá inmediatamente este problema.

activargeek
fuente
1
Además, cada vez que use Python, asegúrese de establecer una opción similar en cualquier IDE / Editor de texto que use
activadogeek
20
También en ATOM, Paquetes> Espacio en blanco> Convertir espacios en pestañas y evitará un dolor de cabeza de error de sintaxis de Python.
loretoparisi
1
Los espacios son el método preferido: consulte PEP008 Sangría y pestañas o espacios. . Sublime también se puede configurar para hacerlo de esta manera.
SiHa
13
Usted dice que los espacios son el método preferido, pero su respuesta le pide a la gente que le pida a sublime que use pestañas. Estoy confundido
gota
@NunoCalaim Bueno, desafortunadamente, eso sucedió después de haber respondido la pregunta. Si está comenzando un nuevo proyecto, utilice la técnica preferida de espacios. Es por eso que hice una edición en negrita para que los recién llegados estén al tanto de la exención de responsabilidad.
activadogeek
137

Para verificar fácilmente si hay problemas con pestañas / espacios, puede hacer esto:

python -m tabnanny yourfile.py

o simplemente puede configurar su editor correctamente, por supuesto :-)

André
fuente
1
Intenté esto en un archivo con algún error de sangría de tabulación / espacio, pero sin salida con un archivo de tabulación incorrecto. ¿alguna idea?
Luchux
1
Tuve un problema con los espacios y el error decía que estaba en la línea 191, pero gracias a tabnanny encontré que el verdadero problema no estaba en esa línea, sino en la línea de arriba.
richar8086
¡Gracias! Que gran consejo. El error fue identificado por flake8 en VS Code pero no pudo identificar dónde estaba el problema, tabnanny lo hizo en un microsegundo.
Steve
39

¿Estás seguro de que no estás mezclando pestañas y espacios en tu espacio en blanco de sangría? (Eso provocará ese error).

Tenga en cuenta que se recomienda que no use pestañas en el código Python. Ver la guía de estilo . Debe configurar Notepad ++ para insertar espacios para pestañas.

zdan
fuente
Estoy confundido. La respuesta anterior establece cambiar una opción del editor de texto para usar pestañas en lugar de espacios.
Spurra
3
@BananaCode Siempre que use SOLO pestañas o SOLO espacios, técnicamente no importa cuál elija. Aunque para python, se prefieren espacios, vea el enlace al que me referí.
zdan
21

Cada vez que encuentro este error, es porque de alguna manera he mezclado pestañas y espacios en mi editor.

Dana
fuente
13

Si usa el editor IDLE de Python, puede hacer lo que sugiere en uno de los mensajes de error similares:

1) seleccionar todo, por ejemplo, Ctrl+A

2) Vaya a Formato -> Desagrupar región

3) Verifique que su sangría sea correcta, guarde y vuelva a ejecutar su programa.

Estoy usando Python 2.5.4

Gatica
fuente
9

Si está utilizando Vim, presione escapar y luego escriba

gg = G

Este auto sangra todo y limpiará cualquier espacio que hayas incluido.

cbartondock
fuente
8

La línea: result = result * idebe tener sangría (es el cuerpo del bucle for).

O bien, tiene caracteres mixtos de espacio y tabulación

Abgan
fuente
Tuve que cambiar la edición en SO, extraño. Vea mi nota actualizada "Editar" en la pregunta
cbrulak
Ok, entonces creo que la segunda línea de mi respuesta es correcta: tienes espacio mixto y caracteres de tabulación (32 y 8 en ASCII, respectivamente)
Abgan
5

En el átomo

ir

Packages > Whitespace > Convert Spaces to Tabs

Luego verifique nuevamente la sangría de su archivo:

python -m tabnanny yourFile.py

o

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

Parece ser un problema de sangría. No tiene que hacer coincidir las llaves en Python, pero tiene que hacer coincidir los niveles de sangría.

La mejor manera de evitar problemas de espacio / tabulación es mostrar caracteres invisibles dentro de su editor de texto. Esto le dará una forma rápida de prevenir y / o resolver errores relacionados con sangría.

Además, la inyección de código copiado y pegado es una fuente común para este tipo de problema.

Matt Kahl
fuente
4

Si usa notepad ++, haga un "reemplazo" con el modo de búsqueda extendida para encontrar \ t y reemplazar con cuatro espacios.

Jackie Lee
fuente
2

para los usuarios de Atom, Packages ->whitspace -> remove trailing whitespaces esto funcionó para mí

Ajá
fuente
2

Solo una adición. Tuve un problema similar con ambas muescas en Notepad ++.

  1. Sangría sin excepción
  2. Nivel de sangría externa

    Vaya a ----> pestaña Buscar ----> toque reemplazar ----> presione el botón de opción Extendido debajo ---> Ahora reemplace \ t con cuatro espacios

    Vaya a ----> pestaña Buscar ----> toque reemplazar ----> presione el botón de radio Extendido debajo ---> Ahora reemplace \ n con nada

JumpMan
fuente
2

Estaba usando la computadora portátil Jupyter y probé casi todas las soluciones anteriores (adaptándome a mi escenario) sin ningún uso. Luego fui línea por línea, eliminé todos los espacios para cada línea y los reemplacé con tabulación. Eso resolvió el problema.

Cur123
fuente
2

Para usuarios de Spyder, vaya a Fuente> Corregir sangría para solucionar el problema de inmediato

Hafiz Abdulbasith
fuente
1

Podría deberse a que la función anterior no está sangrada de la misma manera. es decir

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

Tuve el mismo problema ayer, fue un error de sangría, estaba usando un editor de texto sublime. Me tomé mis horas tratando de arreglarlo y al final terminé copiando el código en el editor de texto VI y funcionó bien. ps python es demasiado sensible al espacio en blanco, asegúrese de no mezclar espacio y tabulación.

usuario3731311
fuente
1

Dado que comprendo que no hay respuesta específica a spyder, voy a añadir una: Básicamente, mirar cuidadosamente su ifdeclaración y asegurarse de que todos if, elify elsetienen la misma separación que es que están en la misma línea en el inicio de este 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!")
NelsonGon
fuente
1

Tenía una función definida, pero no tenía ningún contenido aparte de sus comentarios de función ...

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

Gritó:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(tenga en cuenta que la línea ^ que apunta marca está vacía)

-

Múltiples soluciones:

1: solo comenta la función

2: Añadir comentario de función

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

3: Agregar línea que no hace nada

def foo(bar):
    0

En cualquier caso, asegúrese de hacer obvio por qué es una función vacía, para usted o para sus compañeros que usarán su código

Cedric
fuente
La declaración de aprobación podría ser útil allí :)
KevinG
1

En primer lugar, solo para recordarle que hay un error lógico, es mejor que mantenga el resultado = 1 o de lo contrario su salida será resultado = 0 incluso después de que se ejecute el bucle.

En segundo lugar puedes escribirlo así:

import sys

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

  print "factorial is ",result
  return result

Dejar una línea le dirá al shell de Python que las declaraciones FOR han terminado. Si tiene experiencia en el uso de Python Shell, puede entender por qué tenemos que dejar una línea.

Faisal Ahmed Farooq
fuente
1

Por lo que vale, mi docstring se sangraba demasiado y esto también arroja el mismo error

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

IndentationError: unindent does not match any outer indentation level

plfrick
fuente
esto solucionó mi problema
bhordupur
0

Esto se debe a que hay una mezcla de pestañas y espacios. Puede eliminar todos los espacios y reemplazarlos con pestañas.

O intente escribir esto:

#!/usr/bin/python -tt

Al principio del código. Esta línea resuelve cualquier diferencia entre pestañas y espacios.

Eragon
fuente
0

en mi caso, el problema era la configuración de pydev en Eclipse

pydev @ Eclipse

Rui Martins
fuente
0

Si usa el editor de Komodo, puede hacer lo que sugiere en uno de los mensajes de error similares:

1) seleccionar todo, por ejemplo, Ctrl + A

2) Vaya a Código -> Desagrupar región

3) Verifique que su sangría sea correcta, guarde y vuelva a ejecutar su programa.

Estoy usando Python 3.4.2

Imtiaz Pabel
fuente
0

Si está utilizando texto Sublime para el desarrollo de Python, puede evitar el error utilizando el paquete Anaconda. Después de instalar Anaconda,

  1. abre tu archivo en sublime
  2. clic derecho en los espacios abiertos
  3. elige anaconda
  4. haga clic en autoformato
  5. HECHO O presione CTRL + ALT + R.
Kapilfreeman
fuente
0

En intellij con el complemento de python, Ctrl + Shift + Alt para reformatear el documento solucionó el problema de sangría / tabulación / espacios

René Ferguson
fuente
0

Para usuarios de SPYDER : estoy usando Spyder 3.3.2 con Python 3.7.1 y resolví esto, configurando la sangría para usar pestañas, con los siguientes pasos, haga clic en:

  • Herramientas.
  • Preferencias
  • Editor.
  • Ajustes avanzados.
  • Caracteres de sangría -> Pestañas.

Luego restablezco la línea "sin ayuda" usando la tecla tab.

Por alguna razón, sin esta configuración, a veces tengo el fantasma IndentationError.

Miguel
fuente
0

Por ejemplo:

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

En este código, me ocurrió la misma situación. Simplemente elimine los espacios de sangría anteriores de la línea 2 y 3, y luego use tabulación o espacio. Nunca uses ambos . Dé una sangría adecuada mientras escribe código en python. Para Spyder, vaya a Fuente> Corregir sangría. Lo mismo ocurre con el código VC y el texto sublime o cualquier otro editor. Arregla la sangría.

Ayush Aryan
fuente
-6

Esto sucede principalmente debido al editor. Intente cambiar las pestañas a espacios (4). El mejor IDE o editores amigables para Python son pycharm, sublime, vim para linux.
incluso yo también había encontrado el mismo problema, más tarde descubrí que hay un problema de codificación. Sugiero que también cambies tu editor.

Yunus
fuente