inspect.getargvalues()引发异常“ AttributeError:'tuple'对象没有属性'f_code'” - python

我正在尝试使用Python的inspect模块(在Python 2中)显示有关调用当前函数的函数的信息,包括其参数。

这是一个简单的测试程序:

import inspect

def caller_args():
    frame = inspect.currentframe()
    outer_frames = inspect.getouterframes(frame)
    caller_frame = outer_frames[1]
    return inspect.getargvalues(caller_frame)

def fun_a(arg1):
    print caller_args()

def fun_b():
    fun_a('foo')

if __name__ == '__main__':
    fun_b()

当我运行它时会发生这种情况:

$ python getargvalues_test.py
Traceback (most recent call last):
  File "getargvalues_test.py", line 16, in <module>
    fun_b()
  File "getargvalues_test.py", line 13, in fun_b
    fun_a('foo')
  File "getargvalues_test.py", line 10, in fun_a
    print caller_args()
  File "getargvalues_test.py", line 7, in caller_args
    return inspect.getargvalues(caller_frame)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 829, in getargvalues
    args, varargs, varkw = getargs(frame.f_code)
AttributeError: 'tuple' object has no attribute 'f_code'

我已经搜索了AttributeError异常,但是没有运气。我究竟做错了什么?

(从那以后我就发现了问题,所以我在这里提问并回答,以便将来有此问题的任何人都可以在这里找到答案。)

python大神给出的解决方案

This similar question帮助我发现了问题。

inspect模块的Python documentation提及“框架记录”和“框架对象”,并说明了区别。

inspect.currentframe()返回一个框架对象,但是
inspect.getouterframes()返回帧记录列表。

上面代码中的错误不是没有从调用函数的框架记录中提取框架对象,而是将框架记录而不是框架对象传递给inspect.getouterframes()。 (请注意,inspect.getouterframes()不会检查其参数是否为框架对象。)

这是caller_args()的固定定义(更改为caller_frame的分配):

def caller_args():
    frame = inspect.currentframe()
    outer_frames = inspect.getouterframes(frame)
    caller_frame = outer_frames[1][0]
    return inspect.getargvalues(caller_frame)

根据需要运行:

$ python getargvalues_test_fixed.py
ArgInfo(args=['arg1'], varargs=None, keywords=None, locals={'arg1': 'foo'})