¿Qué hacer con "sangría inesperada" en Python?

117

¿Cómo rectifico el error "sangría inesperada" en Python?

Ventilador de Macintosh
fuente
4
Un fragmento de código que produce el error nos ayudará a comprender mejor su problema. Edite su pregunta para incluir algún código.
RBerteig
7
Esto me parece un problema de espacios en blanco, por lo que una muestra de código sería inútil.
James McMahon
Pregunta vaga y sin respuesta elegida.
rafael.js
"¿Cómo soluciono el error ..."? Identificando dónde ocurrió y solucionando la causa del error. En este caso, al hacer que la sangría de esa línea en particular se vea como lo que espera Python ...
twalberg

Respuestas:

132

Python usa el espaciado al comienzo de la línea para determinar cuándo comienzan y terminan los bloques de código. Los errores que puede obtener son:

Sangría inesperada. Esta línea de código tiene más espacios al comienzo que la anterior, pero la anterior no es el comienzo de un subbloque (por ejemplo, instrucción if / while / for). Todas las líneas de código de un bloque deben comenzar exactamente con la misma cadena de espacios en blanco. Por ejemplo:

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

Este es especialmente común cuando se ejecuta Python de forma interactiva: asegúrese de no poner espacios adicionales antes de sus comandos. (¡Muy molesto al copiar y pegar código de ejemplo!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent no coincide con ningún nivel de sangría exterior. Esta línea de código tiene menos espacios al principio que la anterior, pero igualmente no coincide con ningún otro bloque del que pueda formar parte. Python no puede decidir adónde va. Por ejemplo, en lo siguiente, ¿se supone que la impresión final es parte de la cláusula if o no?

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

Espera un bloque sangrado. Esta línea de código tiene el mismo número de espacios al comienzo que la anterior, pero se esperaba que la última línea comenzara un bloque (por ejemplo, declaración if / while / for, definición de función).

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

Si desea una función que no haga nada, use el pase de comando "no-op" :

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

Se permite mezclar pestañas y espacios (al menos en mi versión de Python), pero Python asume que las pestañas tienen 8 caracteres, lo que puede no coincidir con su editor. Solo di "no" a las pestañas. La mayoría de los editores permiten que se sustituyan automáticamente por espacios.

La mejor manera de evitar estos problemas es usar siempre una cantidad constante de espacios cuando aplica sangría a un subbloque, y lo ideal es usar un buen IDE que resuelva el problema por usted. Esto también hará que su código sea más legible.

Alice Purcell
fuente
7
buena explicación. Además de eso, también gasté sangría Error inesperado cuando mezcló espacios con 'tabulación' y 'barra espaciadora' en NotePad ++, reemplacé la 'pestaña' por 'espacios' y se corrigió.
José Rosas Sáenz
2
@ JoséRosasSáenz Tu comentario me salvó tantos problemas
user3726345
Una causa adicional es perder exceptparte de una trycláusula. El código parece correcto (en el sentido de que la línea sin sangría está destinada a estar fuera del trybloque) pero Python informa esto como un error de "sangría inesperada". Esto se soluciona agregando el except, quizás usando pass(como aquí )
dumbledad
@dumbledad ¿En qué versión de Python ves eso? Cuando pruebo el mío (tanto 2.7.15 como 3.6.8), obtengo un SyntaxError
Alice Purcell
Encontré este error al copiar / pegar código de un sitio web. El posicionamiento parecía correcto, pero necesitaba eliminar el espacio en blanco y volver a aplicarlo usando espacios antes de que QGIS (3.10) ejecutara el código.
benj
23

En Python, el espaciado es muy importante, esto le da la estructura de sus bloques de código. Este error ocurre cuando arruinas la estructura de tu código, por ejemplo, de esta manera:

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

También puede tener una combinación de pestañas y espacios en su archivo.

Le sugiero que utilice un editor de sintaxis de Python como PyScripter o Netbeans

Yanjost
fuente
1
¡Sí, definitivamente use editores compatibles con Python! Tuve un problema en el que estaba editando en notepad ++ con la configuración predeterminada y obtenía un espacio en blanco incorrecto
Dave Archer
2
tabulaciones y espacios mixtos generan "SyntaxError: uso inconsistente de tabulaciones y espacios en sangría"
SilentGhost
Solo como aviso, el complemento Python Netbeans actualmente no convierte pestañas en espacios del código existente. Sin embargo, lo hará mientras escribe código nuevo.
James McMahon
PyCharm puede convertirlo de manera consistente. También resaltará las líneas en "falla". Uso comillas porque no estamos en la década de 1960 y no puedo creer que un lenguaje maravilloso como Python todavía tenga este defecto de muerte cerebral y pérdida de tiempo.
Echelon
Sin querer, cambié de editor a la mitad de la escritura de mi código y rellenó mis sangrías en el código más nuevo. El cambio no fue obvio a la vista, pero el intérprete no ejecutó mi código. Esta publicación me ayudó a encontrar el problema.
Lucien Stals
21

Ejecute su código con la opción -tt para averiguar si está usando tabulaciones y espacios de manera inconsistente

Manoj I
fuente
16

Active los espacios en blanco visibles en cualquier editor que esté usando y active reemplazar las pestañas con espacios.

Si bien puede usar pestañas con Python mezclando pestañas y el espacio generalmente conduce al error que está experimentando. Reemplazar pestañas con 4 espacios es el enfoque recomendado para escribir código Python.

James McMahon
fuente
1
¿Cómo haces esto específicamente? Estoy usando Sublime.
chibole
8

Utilizando la sangría correcta. Python es consciente de los espacios en blanco, por lo que debe seguir sus pautas de sangría para los bloques o obtendrá errores de sangría.

workmad3
fuente
6

Si está escribiendo Python con Sublime y obtiene errores de sangría,

ver -> sangría -> convertir sangría en espacios

El problema que estoy describiendo es causado por el editor de texto Sublime. El mismo problema también podría ser causado por otros editores. Esencialmente, el problema tiene que ver con Python que quiere tratar las sangrías en términos de espacios versus varios editores que codifican las sangrías en términos de pestañas.

Puneet Lamba
fuente
oh ... ¿entonces lo sublime está causando esto?
nitin
Sí, el problema que estoy describiendo es causado por Sublime. También podría ser causado por otros editores. Esencialmente, el problema tiene que ver con Python que quiere tratar las sangrías en términos de espacios versus varios editores que codifican las sangrías en términos de pestañas.
Puneet Lamba
Tuve el mismo problema con Notepad ++. Lo que se veía a los ojos era cierto, así que tardó un tiempo en descifrar esto. Tuve que mover el cursor un carácter a la vez para descubrir que el editor había convertido algunos espacios en blanco en pestañas
Bharat Anand
4

Asegúrese de utilizar la opción "insertar espacios en lugar de pestañas" en su editor. Luego puede elegir si desea un ancho de pestaña de, por ejemplo, 4. Puede encontrar esas opciones en gedit en editar -> preferencias -> editor.

Conclusión: USE ESPACIOS, no pestañas

Alex
fuente
¡Tu resultado final hizo el truco!
Nick Div
3

Este error también puede ocurrir al pegar algo en el intérprete de Python (terminal / consola).

Tenga en cuenta que el intérprete interpreta una línea vacía como el final de una expresión, por lo que si pega algo como

def my_function():
    x = 3

    y = 7

el intérprete interpretará la línea vacía anterior y = 7como el final de la expresión, es decir, que ha terminado de definir su función, y la siguiente línea y = 7tendrá una sangría incorrecta porque es una nueva expresión.

Zoltán
fuente
La clave es que las líneas en blanco dentro de la definición de la función están bien, pero aún deben tener el espacio en blanco inicial ya que Python interpreta cualquier línea en blanco como el final de la función
MichaelChirico
3

Un problema que no parece haber sido mencionado es que este error puede surgir debido a un problema con el código que no tiene nada que ver con la sangría.

Por ejemplo, tome el siguiente guión:

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

Esto devuelve un IndentationError: unexpected unindentcuando el problema es, por supuesto, una except:declaración que falta .

Mi punto: verifique el código de arriba donde se informa la sangría inesperada (des)

WMoreland
fuente
2

Si la sangría se ve bien, eche un vistazo para ver si su editor tiene la opción "Ver espacios en blanco". Habilitar esto debería permitir encontrar dónde se mezclan los espacios y las pestañas.


fuente
2

Hay un truco que siempre me funcionó:

Si tiene una sangría inesperada y ve que todo el código está perfectamente sangrado, intente abrirlo con otro editor y verá qué línea de código no tiene sangría.

Me pasó cuando usé vim, gedit o editores como ese.

Intente usar solo 1 editor para su código.

Jesús Rodríguez
fuente
2

Simplemente copie su script y coloque bajo "" "su código completo" "" ...

especificar esta línea en una variable .. 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..

ahora ejecute este código, en Sublime Editor usando ctrl + b, ahora imprimirá el código sangrado en la consola. Eso es

Mohideen bin Mohammed
fuente
¿Cómo ejecutaré mi código? ¿Tendré que quitar "" "y" "" y la impresión a. Reemplazar y ejecutar normalmente?
chibole
no "" "" "" (comillas triples) hace referencia a su contenido en lugar de una cadena. es necesario porque su código puede contener una cadena que sea comillas simples / dobles, por lo que "" "es obligatorio.
Mohideen bin Mohammed
2

Todo lo que necesita hacer es eliminar espacios o espacios de tabulación del inicio de los siguientes códigos

from django.contrib import admin

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

Ejecute el siguiente comando para resolverlo:

autopep8 -i <filename>.py

Esto actualizará su código y resolverá todos los errores de sangría :)

Espero que esto se resuelva

Sharyar Vohra
fuente
Muy fácil de implementar. Funciona para mí cada vez que lo compartí, espero que sea beneficioso para alguien :)
Sharyar Vohra
1

Notepad ++ estaba dando el espacio de tabulación correcto, pero el problema de sangría finalmente se encontró en el editor de texto Sublime.

Usa el editor de texto Sublime y ve línea por línea

HimalayanCoder
fuente
0

La sangría en Python es importante y esto simplemente no es para la legibilidad del código, a diferencia de muchos otros lenguajes de programación. Si hay algún espacio en blanco o tabulación en su código entre comandos consecutivos, Python dará este error ya que Python es sensible a esto. Es probable que obtengamos este error cuando copiemos y peguemos el código en cualquier Python. Asegúrese de identificar y eliminar estos espacios con un editor de texto como Notepad ++ o elimine manualmente el espacio en blanco de la línea de código donde está obteniendo un error.

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

¡Gracias!

ashu Kr
fuente