Python inspect.getargvalues()引发异常;属性错误:';元组';对象没有属性';f#U代码'&引用;

Python inspect.getargvalues()引发异常;属性错误:';元组';对象没有属性';f#U代码'&引用;,python,introspection,Python,Introspection,我试图使用Python的inspect模块(在Python 2中)来显示有关调用当前函数的函数的信息,包括其参数 下面是一个简单的测试程序: import inspect def caller_args(): frame = inspect.currentframe() outer_frames = inspect.getouterframes(frame) caller_frame = outer_frames[1] return inspect.getarg

我试图使用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'
$python getargvalues\u test.py
回溯(最近一次呼叫最后一次):
文件“getargvalues_test.py”,第16行,在
()
文件“getargvalues_test.py”,第13行,在fun_b中
fun_a(‘foo’)
文件“getargvalues\u test.py”,第10行,在fun\u a中
打印调用方参数()
调用者参数中第7行的文件“getargvalues\u test.py”
返回inspect.getargvalues(调用方\帧)
getargvalues中的文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py”,第829行
args,varargs,varkw=getargs(frame.f_代码)
AttributeError:“tuple”对象没有属性“f_code”
我在谷歌上搜索了那个属性错误的例外,但没有运气。我做错了什么

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

帮助我发现了这个问题

inspect
模块的中提到了“帧记录”和“帧对象”,并解释了两者的区别

  • inspect.currentframe()
    返回帧对象,但
  • inspect.getouterframes()
    返回帧记录列表
上面代码中的错误是没有从调用函数的帧记录中提取帧对象,并传递
inspect.getouterframes()
帧记录而不是帧对象。(请注意,
inspect.getouterframes()
不会检查其参数是否为帧对象。)

以下是
caller\u args()
的固定定义(将赋值更改为
caller\u frame
):

可根据需要运行:

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

AttributeError:“tuple”对象没有属性“f_code”

在你的职责范围内

def caller_args()

调用者\框架是一个数组,您需要项[1][0]作为其参数

inspect.getargvalues(…)

这项工作:

currframe = inspect.currentframe()
callerframe = inspect.getouterframes(currframe, 2)
inspect.getargvalues(callerframe[1][0])
此外,getargvalues函数还返回4个值。在本例中,前三个不重要,第四个包含类似JSON格式的调用者框架参数键/值列表

 _,_,_,values = inspect.getargvalues(callerframe[1][0])
 for i in values:
     argsstring += str(i) + ' : ' + str(values[i])
我的测试如下所示:

import inspect

def log(text):
    currframe = inspect.currentframe()
    callerframe = inspect.getouterframes(currframe, 2)
    _,_,_,values = inspect.getargvalues(callerframe[1][0])
    argsstring = ''
    for i in values:
        argsstring += str(i) + ' : ' + str(values[i])
    print('name of file : ' + callerframe[1][1])
    print('name of function : ' + callerframe[1][3])
    print('line number : ' + str(callerframe[1][2]))
    print('caller function arguments : ' + argsstring)

def doTest(text):
    log(text) 

doTest('this is a test')
import inspect

def log(text):
    currframe = inspect.currentframe()
    callerframe = inspect.getouterframes(currframe, 2)
    _,_,_,values = inspect.getargvalues(callerframe[1][0])
    argsstring = ''
    for i in values:
        argsstring += str(i) + ' : ' + str(values[i])
    print('name of file : ' + callerframe[1][1])
    print('name of function : ' + callerframe[1][3])
    print('line number : ' + str(callerframe[1][2]))
    print('caller function arguments : ' + argsstring)

def doTest(text):
    log(text) 

doTest('this is a test')