2010-02-13 17 views
6

Tengo un error que dice "esperaba un bloque con sangría" Podría guiarme sobre cómo tratar este error. Gracias :)¿Por qué me "esperan un bloque sangrado" cuando intento ejecutar mi secuencia de comandos de Python?

Código ejemplo:

for ch in f: (translatedToken = english_hindi_dict[ch]) if (ch in english_hindi_dict) else (translatedToken = ch) 
+11

Con este tipo de pregunta es muy importante incluir el código que le da el error. –

+3

"cómo lidiar con este error": proporcionar código. –

+0

Lo siento Señor, era simplemente un recién llegado a stackoverflow.com .. acaba de unirse ayer por primera vez, eso no es una excusa, aunque estoy de acuerdo, debería haber sido más específico e ilustrativo con mi consulta seguramente lo hará en el futuro. La línea específica donde estoy experimentando este error se da a continuación: - para ch in f: (translatedToken = english_hindi_dict [ch]) if (ch en english_hindi_dict) else (translatedToken = ch) El error es como: - lse (translatedToken = ch)^IndentationError: esperado un bloque sangrado - – boddhisattva

Respuesta

13

Probablemente esté mezclando pestañas con espacios. Es parece con sangría, pero realmente no lo es.


Su código me da un error diferente:

for ch in f:             \ 
    (translatedToken = english_hindi_dict[ch])    \ 
    if (ch in english_hindi_dict) else (translatedToken = ch) 
                 ↑ 

SyntaxError: invalid syntax 

Tal vez quería decir:

for ch in f: 
    if ch in english_hindi_dict: 
    translatedToken = english_hindi_dict[ch] 
    else: 
    translatedToken = ch 

Tal vez usted quiere decir en su lugar:

for ch in f: 
    translatedToken = english_hindi_dict[ch] if ch in english_hindi_dict else ch 

Ambos deben funcionar bien , y espero que el segundo sea rápido er que el anterior

Ambos se pueden optimizar en translated = str(english_hindi_dict.get(ch, ch) for ch in f) pero ese no es el punto de la pregunta.

2

Python usa indentación (y/o espacios pestañas delante de sus líneas de código) para indicar que un bloque de código de arranques y fines, en relación con lo que precede comunicado pitón .

Por lo tanto, teniendo en PHP, por ejemplo:

if ($blah == 'foo') 
{ 
    // this is line 1 of my code block 
    // this is line 2 
} 

haría bajo pitón, sea:

if blah == 'foo': 
    # this is line 1 of my code block 
    # this is line 2 
    pass 

¿Podrían presentar un cierto código, junto con el error exacto?

+0

Sí, cierto. Vaya: D Editado el código de arriba. –

+0

Y tenga en cuenta que estos comentarios son solo marcadores de posición para el código real. –

+0

@Roger: tienes sentido. Cambiado –

11

Python es un lenguaje que depende en gran medida de la sangría para decidir la estructura del programa a diferencia de C y algunos otros idiomas que utilizan llaves para este fin.

Cuando usted tiene una declaración como:

if true: 
pass 

se quejará porque no hay ninguna declaración con sangría para el if. Usted tendría que fijar que sea:

if true: 
    pass 

Eso suena como el tipo de error que tiene, a pesar de que puede haber sido más obvio que se había publicado el código real. Al establecer un problema, es una buena idea dar el código y explicar cuál fue el comportamiento esperado y cómo se relaciona con el comportamiento real. Harás las vidas de aquellos que intentan ayudarte mucho más fácilmente :-)

También ten en cuenta que puedes tener este problema incluso si tu código parece correcto. Mezclar espacios y pestañas en tu código fuente a menudo puede conducir a esto.

+0

Lo siento Señor, era simplemente un recién llegado a stackoverflow.com .. acaba de unirse ayer por primera vez, eso no es una excusa, aunque estoy de acuerdo, debería haber sido más específico e ilustrativo con mi consulta seguramente lo hará en el futuro. La línea específica donde estoy experimentando este error se da a continuación: - para ch in f: (translatedToken = english_hindi_dict [ch]) if (ch en english_hindi_dict) else (translatedToken = ch) El error es como: - lse (translatedToken = ch)^IndentationError: esperaba un bloque con sangría - – boddhisattva

1

Python determina los bloques por indentación, no por los caracteres { y } como C/C++/Java/PHP/...hace o por if/endif o begin/end pares encontrados en algunos otros idiomas. Por lo tanto, debe tener cuidado con las sangrías; tampoco mezclar tabuladores y espacios.

13

Editando la respuesta para que coincida con el ejemplo del código.

for ch in f: (translatedToken = english_hindi_dict[ch]) if (ch in english_hindi_dict) else (translatedToken = ch) 

simplemente no es válida Python.

En primer lugar, el conteo de legibilidad. Su código es difícil de leer y, por lo tanto, es difícil de depurar. ¿Qué es "ch" y "f"? Además, puedes hacer un trazador de líneas en Python pero no es recomendable, así que pon el for en una línea separada. Luego sangría.

for chunk in file: 
    (translatedToken = english_hindi_dict[chunk]) if (chunk in english_hindi_dict) else (translatedToken = chunk) 

Ahora podemos ver lo que está mal. Haces asignaciones variables en una instrucción condicional. Esto no está permitido en Python. Supongo que tienes un fondo de C/C++ y se utilizan para hacer eso. En Python no puedes, para evitar que escribas código ofuscado. Entonces termina con:

for chunk in file: 
    translatedToken = english_hindi_dict[chunk] if chunk in english_hindi_dict else chunk 

Este código debería funcionar, siempre que utilice Python 2.5+. Pero el operador ternario aún no está disponible en la versión anterior de Python. Vamos a hacer un poco más amable:

for chunk in file: 
    translatedToken = chunk 
    if chunk in english_hindi_dict: 
     translatedToken = english_hindi_dict[chunk] 

Es posible argumentar que es más tiempo para escribir, y estaríamos en lo cierto. Pero pasas más tiempo leyendo el código que escribiéndolo, por lo que tiene sentido que sea fácil de leer. O, por supuesto, una vez que tengas el agarre Python, intentarás que funcione de una manera más pitonica. ¿Has oído hablar de EAFTP?

for chunk in file: 
    try: 
     translatedToken = english_hindi_dict[chunk] 
    except KeyError: 
     translatedToken = chunk 

Pero Python está llena de sorpresas, y usted aprenderá que la mayoría de estos casos de uso clásicos ya han sido atendidos. La biblioteca estándar a menudo proporciona una solución todavía legible elegante y corto:

for chunk in file: 
    translatedToken = english_hindi_dict.get(chunk, chunk) 

Como conclusión: no tratan de escribir Python como usted escribió C o Java y como se escribirían Perl. Otra herramienta, otro estilo.


Para solucionar este problema, el fuego de su función de editor de "buscar y reemplazar" y crea un enorme "Reemplazar todos" para cambiar todas las fichas por 4 espacios, o al contrario. Luego sangra todos tus bloques, y finalmente alinea todas las instrucciones en el mismo bloque.

Gracioso que no apareció antes en SO. Después de todo, es verdad, no es tan obvio.

En Python, separa bloques utilizando espacios o pestañas, no "{".

De modo que cada vez que baje un bloque (una función, un bucle, una clase, etc.), debe aplicar sangría a su código. Esto no es solo una buena práctica, esto es obligatorio. Tu programa se bloqueará si no lo haces.

Ahora, la mayoría de las veces, obtiene este error porque hizo sangría, pero utilizó pestañas y espacios. En un programa de Python, debe usar pestañas o espacios, pero nunca ambos en los mismos archivos.

E.G:

if (age > 18) 
{ 
    printf("You can vote") 
} 

se convierte en:

if age > 18: 
    print("You can vote") 

En la mayoría de los idiomas, se puede hacer:

if (age > 18) 
{ 
printf("You can vote") 
} 

En Python no se puede:

if age > 18: 
print("You can vote") 

lanza una excepción . Lo que es más, debe alinear toda la instrucción del mismo bloque, por lo que:

if age > 18: 
    print("You can vote") 
    print("How cool is that ?") 

está bien, pero:

if age > 18: 
    print("You can vote") 
    print("How cool is that ?") 

lanza una excepción.

Eventualmente, no puede mezclar tabuladores y espacios en el mismo bloque. Por lo tanto:

if age > 18: 
    print("You can vote") 
    print("How cool is that ?") 

se ve bien, pero la voluntad lanza una excepción. Para evitar este problema, simplemente adhiérase a pestañas o espacios. El PEP8, el texto que más se usa como referencia para el estilo de codificación, recomienda usar 4 espacios.

La mayoría de los editores tienen una función global de "búsqueda y reemplazo" que le permite solucionar cualquier problema que pueda tener con eso. Algunos como Geany o Ulipad incluso tienen la función "reemplazar todas las pestañas con espacios".

+0

Señor, esto es exactamente lo que estoy experimentando el problema: - Debería haber sido más específico e ilustrativo con mi consulta seguramente lo hará en el futuro. La línea específica donde estoy experimentando este error se da a continuación: - para ch in f: (translatedToken = english_hindi_dict [ch]) if (ch en english_hindi_dict) else (translatedToken = ch) El error es como: - lse (translatedToken = ch)^IndentationError: esperaba un bloque con sangría - – boddhisattva

+0

Actualizó su pregunta y este contestador para que lo refleje. –

+0

Esta es una gran respuesta. mgj, espero que tomes el consejo general de esta respuesta. Vuelva a escribir su código para que no haya frases únicas, use el estilo de Python. Python es muy diferente de Perl. No es tan rápido en el sorteo de algunas tareas como Perl, pero en general es mucho más rápido. –

3

IndentationError s pueden ser causadas por muchas cosas diferentes. Fuera de la cabeza:

  • Olvidando para sangrar en absoluto.

    Python usa sangrías para delimitar bloques sintácticos. Por ejemplo:

    if will_is_awesome: 
        print "You're right" 
    else: 
        print "You lie!" 
    

    obtendrá un error IndentationError: expected an indented block si se olvida de sangrar. Por ejemplo:

    if will_is_awesome: 
    print "You're right" 
    else: 
    print "You lie!" 
    
  • Comentando a cabo un bloque de sangría.

    Por ejemplo:

    if light_is_green: 
        go_now() 
    else: 
        # go_anyway() 
    do_something_else() 
    

    Esto producirá un IndentationError: expected an indented block porque el comentario hace que la línea después de else: ven vacíos al analizador. Agregar una declaración pass solucionará el problema. Por ejemplo:

    if light_is_green: 
        go_now() 
    else: 
        # go_anyway() 
        pass 
    do_something_else() 
    
  • Fichas y espacios mixtos en las sangrías.

    Las tabulaciones pueden variar entre diferentes máquinas y editores. Si mezcla las pestañas y espacios correctamente, puede obtener su error, pero generalmente produce IndentationError: unindent does not match any outer indentation level, por lo que es poco probable que sea su problema. Vale la pena saberlo de todos modos. Es aconsejable que nunca use pestañas en el código de Python.

+0

¡Buen punto acerca de los comentarios! – badp

Cuestiones relacionadas