2012-08-31 25 views
7

Supongamos que tengo un programa python donde assert se ha usado para definir cómo deberían ser las cosas, y me gustaría capturar anomalías con read-eval-loop en lugar de tener AssertionError.¿Puedo forzar la depuración de python en AssertionError?

Por supuesto, podría haber

if (reality!=expectation): 
    print("assertion failed"); 
    import pdb; pdb.set_trace(); 

pero eso es mucho más feo en el código de una llanura assert(reality==expectation).

Podría tener pdb.set_trace() llamado en un bloque except: en el nivel superior, pero entonces habría perdido todo el contexto de la falla, ¿no? (Quiero decir, stacktrace podría recuperarse del objeto de excepción, pero no de los valores de argumento, etc.)

¿Hay algo como un indicador de línea de comandos --magic que podría convertir el intérprete python3 en lo que necesito?

+0

¿usar eclipse y ejecutarlo en modo de depuración con un punto de interrupción? –

+0

@JoranBeasley: No siempre tienes un IDE a mano. por ejemplo, cuando inicia sesión en un shell ssh. – Constantinius

+1

luego use pdb desde la línea de comando y use puntos de interrupción ... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py' es su' --magic' –

Respuesta

4

Eche un vistazo al proyecto nose. Puede usarlo con el --pdb option para colocarlo en el depurador en caso de errores.

+0

Supongo que es útil para quienes realizan pruebas unitarias, pero eso no es lo que estoy haciendo aquí. – PypeBros

11

Principalmente tomado de this great snippet:

import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

Al inicializar el código con esto, todos AssertionError s debe invocar AP.

+0

va a intentar eso ... – PypeBros

+0

Supongo que el "modo post-mortem" es obligatorio aquí, y no hay ninguna posibilidad de que 'pdb.set_trace()' sea útil, ¿o sí? – PypeBros

+0

No estoy seguro aquí, supongo que debes intentarlo. – Constantinius

Cuestiones relacionadas