如何获取传递给函数的参数在堆栈上的值?

14

使用:

traceback.print_stack()

我可以获得:

  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()

有没有方法可以得到像这样的东西:

  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()

我只想查看函数中传递的参数。


Python必须在每次调用函数时存储这些过去的值,因此我认为不行。如果你只是想调试,那么使用真正的调试器或记录这些值。 - Jochen Ritzel
1
@Jochen:我认为Python确实存储了这些值,因为回溯引用了帧,所以该帧不会被垃圾回收。 - Sven Marnach
@Jochen:我不是在尝试调试。我只是想把这些信息记录在日志中,以便更多地了解我需要调试的内容。 - Adam
@Adam 请将您的解决方案发布为答案,不要包含在问题中。我已经将其删除,但您可以在修订历史记录中访问它:http://stackoverflow.com/posts/6061744/revisions - BartoszKP
2个回答

14

你可以通过使用inspect.getargvalues()并访问属于你的traceback的堆栈帧来编写一些东西:

 inspect.getargvalues(traceback.tb_frame)

要想得到完全符合要求的输出,您需要做一些工作。上面那行代码仅适用于最内部的帧,所以您需要遍历堆栈并访问每个帧所需的信息。inspect.getouterframes() 可能会派上用场。


10
你可以使用inspect模块来实现这个功能:

你可以使用inspect模块来完成此操作:

>>> 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接