2011-05-19 10 views
12

Usando:¿Cómo obtener el valor de los argumentos pasados ​​a las funciones en la pila?

traceback.print_stack() 

puedo conseguir:

File "x.py", line 20, in <module> 
    y(x) 
    File "x.py", line 11, in y 
    fun(x) 
    File "x.py", line 8, in fun 
    traceback.print_stack() 

que hay alguna manera de obtener algo como esto:

File "x.py", line 20, in <module> 
    y(x) WHERE x == 1 
    File "x.py", line 11, in y 
    fun(x) WHERE x == 'str' 
    File "x.py", line 8, in fun 
    traceback.print_stack() 

sólo quiero ver qué argumentos se pasó a funciones .

+0

Python tendría que almacenar estos últimos valores cada vez que llama a una función, así que no lo creo. Si solo intenta depurar, utilice un depurador real o registre los valores. –

+1

@Jochen: creo que Python almacena los valores, ya que el traceback hace referencia al marco, por lo que el marco no es basura. –

+0

@Jochen: No estoy intentando depurar. Solo quiero poner esta información en el registro. Para obtener más información acerca de eso, necesito depurar. – Adam

Respuesta

10

es probable que pueda plataforma algo mediante el uso de inspect.getargvalues() y acceder al marco de pila que pertenece a su rastreo:

inspect.getargvalues(traceback.tb_frame) 

Vas a tener que hacer algún trabajo para conseguir la salida exactamente como se desea. La línea anterior es solo para el marco más interno, por lo que tendrás que subir la pila y acceder a la información que necesitas para cada fotograma. inspect.getouterframes() puede ser útil.

9

Usted puede utilizar el módulo inspect para esto:

>>> import inspect 
... def fn(x): 
...  try: 
...   print(1/0) 
...  except ZeroDivisionError as e: 
...   frames = inspect.trace() 
...   argvalues = inspect.getargvalues(frames[0][0]) 
...   print("Argvalues: ", inspect.formatargvalues(*argvalues)) 
>>> fn(12) 
Argvalues: (x=12) 
+0

Se ve mejor que mi código. ¡Gracias! – Adam

Cuestiones relacionadas