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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow