gpt4 book ai didi

python - inspect.getargvalues() 抛出异常 "AttributeError: ' 元组'对象没有属性 'f_code'“

转载 作者:太空宇宙 更新时间:2023-11-04 10:24:54 24 4
gpt4 key购买 nike

我正在尝试使用 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 异常,但没有成功。我做错了什么?

(我已经发现了这个问题,所以我在这里问答,这样以后遇到这个问题的人都能在这里找到答案。)

最佳答案

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

Python documentation inspect 模块提到了“帧记录”和“帧对象”,并解释了它们的区别。

  • 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'})

关于python - inspect.getargvalues() 抛出异常 "AttributeError: ' 元组'对象没有属性 'f_code'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com