¿Cuál es la forma más sencilla de usar Python pdb para inspeccionar la causa de una excepción no controlada?

Acabo de convertir todos los datos de mis pruebas unitarias de JSON a YAML, y ahora aparece una excepción en algún lugar de mi código. Más específicamente, esto se imprime rastrear:

  Rastreo (llamadas recientes más última):
   Archivo "tests / test_addrtools.py", línea 95, en test_validate_correctable_addresses
     self.assertTrue (self.validator (addr), msg)
   Archivo "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", línea 608, en __call__
     auto validación (addr)
   Archivo "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", línea 692, en validar
     if self._correction_citytypo (addr): return
   Archivo "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", línea 943, en _correction_citytypo
     ratio = lev_ratio (old_city, city)
 TypeError: relación esperada dos cadenas o dos Unicodes 

Ahora, el archivo “addrtools.py” en la línea 943 contiene la respuesta a mi problema. Quiero ver el tipo y los valores de old_city y city en el ámbito donde se produce la excepción. Tengo este tipo de problema todo el tiempo, y un método rápido e indoloro de usar pdb para inspeccionar a los locales en el ámbito donde se produce la excepción me ahorraría mucho tiempo en el futuro.


Intenté la solución publicada en la respuesta a esta pregunta , pero la función post mortem me coloca en python2.7 / unittest / main.py (231) runTests () que no me ayuda mucho. Supongo que esto se debe a que la excepción se captura y se vuelve a generar desde el código de prueba de unidad.

Envuélvalo con eso:

 def debug_on(*exceptions): if not exceptions: exceptions = (AssertionError, ) def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): try: return f(*args, **kwargs) except exceptions: pdb.post_mortem(sys.exc_info()[2]) return wrapper return decorator 

Ejemplo:

 @debug_on(TypeError) def buggy_function() .... raise TypeError 

La función de superconjunto de prueba de la pdb tiene una opción que te pdb a pdb cuando falla una prueba, si puedes usar la nariz como tu corredor de prueba:

 --pdb Drop into debugger on errors --pdb-failures Drop into debugger on failures