Cómo atrapar el error de sangría

En primer lugar, no tengo ningún problema con el código mal indentado y tengo una idea de cómo funciona esta excepción.

Pregunto, si hay alguna manera de capturar IndentationError en el código con un bloque try / except? Por ejemplo, digamos que estoy escribiendo una prueba para una función escrita por otra persona. Quiero ejecutarlo en el bloque try / except y manejar todas las advertencias que pueda hacer. Sé que no es un mejor ejemplo, pero el primero me viene a la mente. Por favor, no se centre en un ejemplo, sino en el problema.

Veamos el código:

try: f() except IndentationError: print "Error" print "Finished" 

La función:

 def f(): print "External function" 

Y el resultado es:

 External function Finished 

Y eso es algo, estoy listo para entender, porque la sangría en la función externa era constante.

Pero cuando la función se ve así:

 def f(): print "External function" print "with bad indentation" 

La excepción es no manejada:

  print "with bad indentation" ^ IndentationError: unexpected indent 

¿Hay alguna manera de lograrlo? Supongo que esa es la cuestión de comstackr, y hasta ahora no veo ninguna posibilidad de atrapar. ¿Tiene algún sentido el except IndentationError ?

Si, esto se puede hacer. Sin embargo, la función bajo prueba tendría que vivir en un módulo diferente:

 # test1.py try: import test2 except IndentationError as ex: print ex # test2.py def f(): pass pass # error 

Cuando se ejecuta, esto atrapa correctamente la excepción. No vale nada que la comprobación se realice en todo el módulo a la vez; No estoy seguro si hay una manera de hacerlo más detallado.

IndentationError se IndentationError cuando se comstack el módulo. Puede capturarlo al importar un módulo, ya que el módulo se comstackrá en la primera importación. No puede atraparlo en el mismo módulo que contiene try/except , porque con IndentationError , Python no podrá terminar de comstackr el módulo y no se ejecutará ningún código en el módulo.

Podría usar una herramienta como pylint , que analizará su módulo e informará de una sangría incorrecta, así como muchos otros errores.