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

14 投票
2 回答
6641 浏览
提问于 2025-04-16 17:58

使用:

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

我只是想看看传递给函数的参数是什么。

2 个回答

10

你可以使用 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)
14

你可以通过使用 inspect.getargvalues() 来实现一些功能,具体来说就是访问与你的错误追踪信息相关的堆栈帧。

 inspect.getargvalues(traceback.tb_frame)

不过,你需要花一些时间来调整输出,确保它符合你的需求。上面提到的代码只适用于最内层的堆栈帧,所以你需要逐层向上遍历堆栈,获取每一层所需的信息。此时,inspect.getouterframes() 可能会对你有所帮助。

撰写回答