Python inspect.getargvalues()引发异常;属性错误:';元组';对象没有属性';f#U代码'&引用;
我试图使用Python的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
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')