Python Language
Sangría
Buscar..
Errores de sangría
El espacio debe ser uniforme y uniforme en todo. La sangría incorrecta puede causar un IndentationError
o hacer que el programa haga algo inesperado. El siguiente ejemplo genera un IndentationError
:
a = 7
if a > 5:
print "foo"
else:
print "bar"
print "done"
O si la línea que sigue a dos puntos no tiene sangría, también se levantará un IndentationError
:
if True:
print "true"
Si agrega sangría donde no pertenece, se generará un IndentationError
:
if True:
a = 6
b = 5
Si olvida desmarcar la funcionalidad podría perderse. En este ejemplo, None
se devuelve en lugar del False
esperado:
def isEven(a):
if a%2 ==0:
return True
#this next line should be even with the if
return False
print isEven(7)
Ejemplo simple
Para Python, Guido van Rossum basó la agrupación de declaraciones en sangría. Las razones de esto se explican en la primera sección de las "Preguntas frecuentes sobre Python de diseño e historia" . Los dos puntos, :
, se utilizan para declarar un bloque de código con sangría , como el siguiente ejemplo:
class ExampleClass:
#Every function belonging to a class must be indented equally
def __init__(self):
name = "example"
def someFunction(self, a):
#Notice everything belonging to a function must be indented
if a > 5:
return True
else:
return False
#If a function is not indented to the same level it will not be considers as part of the parent class
def separateFunction(b):
for i in b:
#Loops are also indented and nested conditions start a new indentation
if i == 1:
return True
return False
separateFunction([2,3,5,6,1])
¿Espacios o pestañas?
La sangría recomendada es de 4 espacios, pero se pueden usar tabulaciones o espacios siempre que sean consistentes. No mezcle tabulaciones y espacios en Python ya que esto causará un error en Python 3 y puede causar errores en Python 2 .
Cómo se analiza la sangría
Los espacios en blanco son manejados por el analizador léxico antes de ser analizados.
El analizador léxico usa una pila para almacenar niveles de sangría. Al principio, la pila contiene solo el valor 0, que es la posición más a la izquierda. Cada vez que comienza un bloque anidado, el nuevo nivel de sangría se empuja en la pila, y se inserta un token "INDENT" en el flujo de token que se pasa al analizador. Nunca puede haber más de un token "INDENT" en una fila ( IndentationError
).
Cuando se encuentra una línea con un nivel de sangría más pequeño, los valores se extraen de la pila hasta que un valor está en la parte superior, que es igual al nuevo nivel de sangría (si no se encuentra ninguno, se produce un error de sintaxis). Para cada valor que aparece, se genera un token "DEDENT". Obviamente, puede haber múltiples tokens "DEDENT" en una fila.
El analizador léxico omite líneas vacías (aquellas que solo contienen espacios en blanco y posiblemente comentarios), y nunca generará tokens "INDENT" o "DEDENT" para ellas.
Al final del código fuente, se generan tokens "DEDENT" para cada nivel de sangrado que queda en la pila, hasta que solo queda el 0.
Por ejemplo:
if foo:
if bar:
x = 42
else:
print foo
se analiza como:
<if> <foo> <:> [0]
<INDENT> <if> <bar> <:> [0, 4]
<INDENT> <x> <=> <42> [0, 4, 8]
<DEDENT> <DEDENT> <else> <:> [0]
<INDENT> <print> <foo> [0, 2]
<DEDENT>
El analizador que maneja los tokens "INDENT" y "DEDENT" como delimitadores de bloque.