Saltar al contenido

Recibo un IndentationError. ¿Cómo lo soluciono?

Posterior a de una prolongada compilación de información resolvimos este disgusto que tienen algunos usuarios. Te brindamos la respuesta y nuestro objetivo es servirte de gran apoyo.

¿Por qué importa la sangría?

En Python, la sangría se usa para delimitar bloques de código. Esto es diferente de muchos otros idiomas que usan llaves. para delimitar bloques como Java, Javascript y C. Debido a esto, los usuarios de Python deben prestar mucha atención a cuándo y cómo sangran su código porque los espacios en blanco son importantes.

Cuando Python encuentra un problema con la sangría de su programa, genera una excepción llamada IndentationError o TabError.

Una pequeña historia

Las razones históricas por las que Python usa sangría frente a las llaves posiblemente más comúnmente aceptadas se describe en un artículo de la historia de Python por Guido van Rossum, el creador de Python:

El uso de la sangría en Python proviene directamente de ABC, pero esta idea no se originó con ABC; ya había sido promovida por Donald Knuth y era un concepto bien conocido de estilo de programación. (El lenguaje de programación occam también lo usó). Sin embargo, los autores de ABC sí inventaron el uso de dos puntos que separa la cláusula de entrada del bloque con sangría. Después de las primeras pruebas de usuario sin los dos puntos, se descubrió que el significado de la sangría no estaba claro para los principiantes a los que se les enseñaba los primeros pasos de la programación. La adición del colon lo aclaró significativamente: el colon de alguna manera llama la atención sobre lo que sigue y une las frases anteriores y posteriores de la manera correcta.

¿Cómo sangro mi código?

La regla básica para sangrar el código Python (considerando que usted trata todo el programa como un “bloque básico”) es: La primera instrucción en un bloque básico, y cada instrucción subsiguiente debe tener la misma sangría.

Entonces, técnicamente, el siguiente programa de Python es correcto:

def perm(l):
        # Compute the list of all permutations of l
    if len(l) <= 1:
                  return [l]
    r = []
    for i in range(len(l)):
             s = l[:i] + l[i+1:]
             p = perm(s)
             for x in p:
              r.append(l[i:i+1] + x)
    return r

Sin embargo, como probablemente pueda ver desde arriba, la sangría aleatoria de su código hace que sea extremadamente difícil de leer y seguir el flujo del programa. Es mejor ser coherente y seguir un estilo.

PEP8, la guía de estilo de Python, recomienda que se utilicen cuatro espacios por nivel de sangría:

Utilice 4 espacios por nivel de sangría.

Es decir, cada instrucción que está comenzando un nuevo bloque y cada instrucción subsiguiente en el nuevo bloque, deben tener una sangría de cuatro espacios desde el nivel de sangría actual. Aquí está el programa anterior sangrado de acuerdo con la guía de estilo PEP8:

def perm(l):
    # Compute the list of all permutations of l
    if len(l) <= 1:
        return [l]
    r = []
    for i in range(len(l)):
        s = l[:i] + l[i+1:]
        p = perm(s)
        for x in p:
            r.append(l[i:i+1] + x)
    return r

¿Puedo seguir usando pestañas?

Python se da cuenta de que algunas personas todavía prefieren las pestañas a los espacios y que el código heredado puede usar pestañas en lugar de espacios, por lo que permite el uso de pestañas como sangría. PEP8 toca este tema:

Los espacios son el método de sangría preferido.

Las pestañas deben usarse únicamente para mantener la coherencia con el código que ya está sangrado con pestañas.

Sin embargo, tenga en cuenta que la única gran advertencia es no usar ambas pestañas y espacios para sangría. Si lo hace, puede provocar todo tipo de errores de sangría extraños y difíciles de depurar. Python expande las pestañas a la siguiente octava columna, pero si su editor está configurado para un tamaño de pestaña de 4 columnas, o si usa espacios y pestañas, puede producir fácilmente código sangrado que aspecto bien en su editor, pero Python se negará a ejecutarse. El compilador de Python 3 explícitamente rechaza cualquier programa que contenga una mezcla ambigua de tabulaciones y espacios, generalmente al levantar un TabError. Sin embargo, de forma predeterminada, Python 2 aún permite mezclar pestañas y espacios, pero se recomienda encarecidamente no utilizar esta "función". Utilizar el -t y -tt banderas de línea de comando para obligar a Python 2 a generar una advertencia o (preferiblemente) un error, respectivamente. PEP8 también analiza este tema:

Python 3 no permite mezclar el uso de pestañas y espacios para la sangría.

El código de Python 2 sangrado con una combinación de tabulaciones y espacios debe convertirse para usar espacios exclusivamente.

Al invocar el intérprete de línea de comandos de Python 2 con la opción -t, emite advertencias sobre el código que mezcla ilegalmente tabulaciones y espacios. Cuando se usa -tt, estas advertencias se convierten en errores. ¡Estas opciones son muy recomendables!

¿Qué significa "IndentationError: sangría inesperada"?

Problema

Este error ocurre cuando una declaración tiene sangría innecesaria o su sangría no coincide con la sangría de declaraciones anteriores en el mismo bloque. Por ejemplo, la primera declaración del programa siguiente tiene sangría innecesaria:

>>>  print('Hello') # this is indented 
  File "", line 1
    print('Hello') # this is indented 
    ^
IndentationError: unexpected indent

En este ejemplo, el can_drive = True línea en el if block no coincide con la sangría de ninguna declaración anterior:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...      can_drive = True # incorrectly indented
  File "", line 3
    can_drive = True # incorrectly indented
    ^
IndentationError: unexpected indent

Reparar

La solución para este error es asegurarse primero de que la línea problemática necesite incluso sangrarse. Por ejemplo, el ejemplo anterior usando print se puede arreglar simplemente quitando la sangría de la línea:

>>> print('Hello') # simply unindent the line
Hello

Sin embargo, si está seguro de que es necesario sangrar la línea, la sangría debe coincidir con la de una declaración anterior en el mismo bloque. En el segundo ejemplo anterior usando if, podemos corregir el error asegurándonos de que la línea con can_drive = True tiene sangría al mismo nivel que las declaraciones anteriores en el if cuerpo:

>>> age = 10
>>> can_drive = None
>>> 
>>> if age >= 18:
...     print('You can drive')
...     can_drive = True # indent this line at the same level.
... 

¿Qué significa "IndentationError: se esperaba un bloque con sangría"?

Problema

Este error ocurre cuando Python ve el 'encabezado' de una declaración compuesta, como if : o while : pero el cuerpo de la declaración compuesta o cuadra nunca se define. Por ejemplo, en el código siguiente comenzamos un if declaración, pero nunca definimos un cuerpo para la declaración:

>>> if True:
... 
  File "", line 2
    
    ^
IndentationError: expected an indented block

En este segundo ejemplo, comenzamos a escribir un for bucle, pero nos olvidamos de sangrar el for cuerpo de bucle. Entonces Python todavía espera un bloque con sangría para el for cuerpo del bucle:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
... print(name)
  File "", line 2
    print(name)
        ^
IndentationError: expected an indented block

Los comentarios no cuentan como cuerpos:

>>> if True:
...     # TODO
...
  File "", line 3

    ^
IndentationError: expected an indented block

Reparar

La solución para este error es simplemente incluir un cuerpo para la declaración compuesta.

Como se muestra arriba, un error común de los nuevos usuarios es que se olvidan de sangrar el cuerpo. Si este es el caso, asegúrese de que cada declaración que deba incluirse en el cuerpo de la declaración compuesta tenga una sangría al mismo nivel debajo del comienzo de la declaración compuesta. Aquí está el ejemplo anterior arreglado:

>>> names = ['sarah', 'lucy', 'michael']
>>> for name in names:
...     print(name) # The for loop body is now correctly indented.
... 
sarah
lucy
michael

Otro caso común es que, por alguna razón, un usuario puede no querer definir un cuerpo real para la declaración compuesta, o el cuerpo puede estar comentado. En este caso, el pass se puede utilizar una declaración. los pass La declaración se puede usar en cualquier lugar donde Python espere una o más declaraciones como marcador de posición. De la documentación para pass:

pasar es un null operación: cuando se ejecuta, no sucede nada. Es útil como marcador de posición cuando se requiere una declaración sintácticamente, pero no es necesario ejecutar ningún código, por ejemplo:

def f(arg): pass    # a function that does nothing (yet)

class C: pass       # a class with no methods (yet)

Aquí está el ejemplo anterior con el if declaración arreglada usando el pass palabra clave:

>>> if True:
...     pass # We don't want to define a body.
... 
>>>

¿Qué significa "IndentationError: unindent no coincide con ningún nivel de sangría externa"?

Problema

Este error se produce cuando se quita la sangría de una declaración, pero ahora el nivel de sangría de esa declaración no coincide con el de ninguna declaración anterior. Por ejemplo, en el siguiente código, desangramos la segunda llamada a print. Sin embargo, el nivel de sangría no coincide con el de ninguna declaración anterior:

>>> if True:
...     if True:
...         print('yes')
...    print()
  File "", line 4
    print()
          ^
IndentationError: unindent does not match any outer indentation level

Este error es especialmente difícil de detectar porque incluso un espacio hará que su código falle.

Reparar

La solución es asegurarse de que cuando se quita la sangría de una declaración, el nivel de sangría coincide con el de una declaración anterior. Considere el ejemplo anterior una vez más. En el ejemplo, quiero que la segunda llamada a imprimir esté en la primera if cuerpo de declaraciones. Así que necesito asegurarme de que el nivel de sangría de esa línea coincida con el de las declaraciones anteriores en la primera if cuerpo de la declaración:

>>> if True:
...     if True:
...         print('yes')
...     print() # indentation level now matches former statement's level.
... 
yes

>>> 

Sigo recibiendo un IndentationError pero mi programa parece tener sangría correcta. ¿Qué debo hacer?

Si visualmente su programa parece tener la sangría correcta, pero aún recibe una IndentationError lo más probable es que tengas mixed pestañas con espacios. Esto a veces hará que Python genere errores extraños. Ver la subsección Casos especiales debajo ¿Qué significa "TabError: uso inconsistente de tabulaciones y espacios en sangría"? para una explicación más detallada del problema.

¿Qué significa "TabError: uso inconsistente de tabulaciones y espacios en sangría"?

Problema

Este error solo ocurre cuando intenta mezclar tabulaciones y espacios como caracteres de sangría. Como se dijo anteriormente, Python no permitirá que su programa contenga una combinación de pestañas y espacios, y generará la excepción específica TabError si encuentra que tienes. Por ejemplo, en el programa siguiente, se usa una combinación de tabulaciones y espacios para la sangría:

>>> if True:
...     if True:
...         print()
...     print()
...     print()
  File "", line 5
    print()
          ^
TabError: inconsistent use of tabs and spaces in indentation

Aquí hay una imagen que muestra visualmente los espacios en blanco en el programa anterior. Los puntos grises son espacios y las flechas grises son pestañas:

ingrese la descripción de la imagen aquí

Podemos ver que tenemos de hecho mixed espacios y tabulaciones para la sangría.

Casos especiales

Nota Python nosiempre levantar un TabError si mezcla tabulaciones y espacios en su programa. Si la sangría del programa no es ambigua, Python permitirá que las pestañas y los espacios sean mixed. Por ejemplo:

>>> if True:
...     if True: # tab
...         pass # tab, then 4 spaces
... 
>>>

Y, a veces, Python simplemente se ahoga con la mezcla de pestañas y espacios y genera erróneamente un IndentationError excepción cuando un TabError sería más apropiado. Otro ejemplo:

>>> if True:
...     pass # tab
...     pass # 4 spaces
  File "", line 3
    pass # 4 spaces
                ^
IndentationError: unindent does not match any outer indentation level

Como puede ver, ejecutar su código de esta manera puede crear errores misteriosos. Aunque el programa visualmente parece estar bien, Python se confundió al tratar de analizar las pestañas y los espacios utilizados para la sangría y se equivocó.

Estos son ejemplos excelentes que demuestran por qué nunca mezclar pestañas y espacios y hacer uso de las -t y -tt indicadores de intérprete cuando se usa Python 2.

Reparar

Si su programa es corto, probablemente la solución más fácil y rápida sea simplemente volver a sangrar el programa. Asegúrese de que cada declaración tenga una sangría de cuatro espacios por nivel de sangría (consulte ¿Cómo sangro mi código?).

Sin embargo, si ya tiene un programa grande que ha mixed tabuladores y espacios en, existen herramientas automatizadas que se pueden utilizar para convertir todas las sangrías en solo espacios.

Muchos editores como PyCharm y SublimeText tienen opciones para convertir automáticamente las pestañas en espacios. También hay varios en línea herramientas como Tabs To Spaces o Browserling que le permiten volver a sangrar rápidamente su código. También hay herramientas escritas en Python. autopep8, por ejemplo, puede volver a sangrar automáticamente su código y corregir otros errores de sangría también.

Sin embargo, incluso las mejores herramientas a veces no podrán corregir todos los errores de sangría y tendrá que corregirlos manualmente. Por eso es importante siempre aplicar una sangría adecuada a su código desde el principio.

Una nota sobre los problemas de sangría relacionados con "SyntaxError"

Aunque no a menudo, a veces es seguro SyntaxError se generan excepciones debido a una sangría incorrecta. Por ejemplo, mire el código a continuación:

if True:
    pass
pass # oops! this statement should be indented!.
else:
    pass

Cuando se ejecuta el código anterior, un SyntaxError is raised:

Traceback (most recent call last):
  File "python", line 4
    else:
       ^
SyntaxError: invalid syntax

Aunque Python plantea un SyntaxError, los verdadero problema con el código anterior, es que el segundo pass La declaración debe tener sangría. Porque el segundo pass no tiene sangría, Python no se da cuenta de que el anterior if declaración y el else declaraciones están destinadas a estar conectadas.

La solución para este tipo de error es simplemente volver a sangrar correctamente su código. Para ver cómo sangrar correctamente su código, consulte la sección ¿Cómo sangro mi código?.

Todavía estoy teniendo dificultades con la sintaxis de sangría de Python. ¿Qué debo hacer?

No se desanime si todavía está luchando. Puede llevar tiempo acostumbrarse a las reglas de sintaxis de espacios en blanco de Python. A continuación, se ofrecen algunos consejos que le ayudarán:

  • Obtenga un editor que le dirá cuando tenga un error de sangría. Algunos de los productos que se mencionan anteriormente son PyCharm, SublimeText y Jupyter Notebook.
  • Cuando aplique sangría a su código, cuente en voz alta para sí mismo cuántas veces presiona la barra espaciadora (o tabulador key). Por ejemplo, si necesita sangrar una línea con cuatro espacios, diría en voz alta "uno, dos, Tres, cuatro"mientras presiona simultáneamente la barra espaciadora cada vez. Suena tonto, pero ayuda a entrenar su cerebro para pensar en qué tan profundo está sangrando su código.
  • Si tiene un editor, vea si tiene una opción para convertir automáticamente las pestañas en espacios.
  • Ver el código de otros. Explore github o Stackoverflow y vea ejemplos de código Python.
  • Solo escribe el código. Esa es la mejor manera de mejorar. Cuanto más escriba código Python, mejor obtendrá.

Recursos utilizados

  • https://en.wikipedia.org/
  • https://docs.python.org/3/
  • http://python-history.blogspot.com/2009/02/early-language-design-and-development.html
  • https://www.python.org/dev/peps/pep-0008/

Texto sublime 3

Si sucede que codifica en Sublime Text 3, esto podría ayudarlo con problemas de sangría

En Sublime Text, mientras edita un archivo Python:

Menú de texto sublime > Preferencias > Configuración: sintaxis específica :

Python.sublime-settings


    "tab_size": 4,
    "translate_tabs_to_spaces": true

Sección de Reseñas y Valoraciones

Tienes la opción de añadir valor a nuestro contenido aportando tu experiencia en las acotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *