salto print linea imprimir funcion end agregar python debugging pdb

print - ¿Cómo imprimir todos los valores de variables al depurar Python con pdb, sin especificar cada variable?



input python (2)

Como figura en esta lista para múltiples idiomas :

a = 1 b = 1 n = ''value'' #dir() == [''__builtins__'', ''__doc__'', ''__name__'', ''__package__'', ''a'', ''b'', ''n''] for var in dir()[4:]: value_of_var = eval(var) print(value_of_var)

Salida:

1 1 ''value''

Etiquetar cada uno es tan simple como imprimir var + " equals " + eval(var) .

Usted declara que su "salida ideal" es exactamente el resultado al escribir pa, b, ... , n, ... :

vars = [] for var in dir()[4:-1] vars.append(var) print(tuple(vars))

La salida se ve así:

(1, 1, ''value'')

Estoy depurando mis scripts de Python usando pdb y el manual dice que puedo usar el comando p variables para imprimir los valores de las variables especificadas en un cierto punto. Pero, ¿y si tuviera muchas variables, como 20 variables, y me gustaría rastrear el valor de todas ellas? ¿Cómo imprimo todos sin especificar cada uno manualmente? Tomemos como ejemplo este script:

a = 1 b = 2 c = 3

Puedo depurarlo con pdb e imprimirlos usando pa, b, c como este:

$ python -m pdb test.py > /media/test.py(1)<module>() -> a = 1 (Pdb) n > /media/test.py(2)<module>() -> b = 2 (Pdb) n > /media/test.py(3)<module>() (Pdb) n --Return-- > /media/test.py(3)<module>()->None -> c = 3 (Pdb) p a, b, c (1, 2, 3) (Pdb)

Pero tengo que especificar manualmente cada variable. ¿Hay alguna manera de imprimir todas las variables a la vez, sin especificar cada una de ellas?


pdb es un shell de python con todas las funciones, por lo que puede ejecutar comandos arbitrarios.

locals() y globals() mostrarán todas las variables en el alcance con sus valores.

Puede usar dir() si no está interesado en los valores.

Cuando declaras una variable en Python, la colocas en locales o globales, según corresponda, y no hay manera de distinguir una variable que definiste y algo que está en tu alcance por otro motivo.

Cuando usa dir (), es probable que las variables que le interesan estén al principio o al final de esa lista. Si quieres obtener la clave, pares de valores

Filtrar locals () puede parecerse a esto:

>>> x = 10 >>> y = 20 >>> {k: v for k,v in locals().iteritems() if ''__'' not in k and ''pdb'' not in k} {''y'': 20, ''x'': 10}

Si tus lugareños () son un verdadero desastre, necesitarás algo un poco más severo. Puede colocar la siguiente función en un módulo en su pythonpath e importarla durante su sesión de depuración.

def debug_nice(locals_dict, keys=[]): globals()[''types''] = `__import__`(''types'') exclude_keys = [''copyright'', ''credits'', ''False'', ''True'', ''None'', ''Ellipsis'', ''quit''] exclude_valuetypes = [types.BuiltinFunctionType, types.BuiltinMethodType, types.ModuleType, types.TypeType, types.FunctionType] return {k: v for k,v in locals_dict.iteritems() if not (k in keys or k in exclude_keys or type(v) in exclude_valuetypes) and k[0] != ''_''}

He agregado una sesión de ejemplo en pastebin

Hay un par de casos que esto falla. Y es posible que desee extenderlo para permitirle pasar los tipos también. Pero debería permitirle filtrar casi todo excepto las variables que definió.

dir ()

Si solo quieres los últimos 20 valores para que obtengas una salida como >>> p var1 var2 ... varn te daría, entonces es mejor que corte el directorio dir () como dir () [- 20:], pero no ganaste Ver fácilmente la relación entre las variables y los valores . por ejemplo: "¿Declaro foo antes o después de la barra?"

Si desea ver esa relación, puede intentar algo como esto, que asume que sus variables están al final de dir (). Puede cortar de manera diferente si están al principio. Esto no funcionará bien si sus variables no son contiguas.

>>> zip(dir(), [eval(var) for var in dir()])[-4:] [(''a'', 10), (''var'', ''var''), (''x'', 30), (''y'', 50)]