以下代码
class Foo(object):
def do_something(self):
print(main.func_code.co_varnames)
for item in main.func_code.co_varnames:
eval(item)
def main():
a = 1
b = Foo()
b.do_something()
main()
将打印
('a', 'b')
以及以
结尾的错误消息name 'a' is not defined
不知何故,Foo对象能够获取另一个函数的局部变量的名称,但不能对它们做任何事情。我该如何解决这个问题?
背景。这个问题是出于调试目的。我希望能够显示有关在我的代码中创建的变量的信息。
答案 0 :(得分:0)
为函数定义局部变量。因此,只要定义了函数,解释器就会知道"将有2个局部变量,名为a
和b
。当函数被调用时,对内存分配很有用。把它想象成一幅蓝图。
然后,当您尝试eval
某个字符串时,它会使用locals()
所在位置的上下文(globals()
和eval
)来执行此操作。
您在该范围内没有任何a
。因此,它失败了,因为它没有定义。
答案 1 :(得分:0)
inspect.currentframe
获取堆栈框架对象f_back
属性f_locals
属性import inspect
def get_variables():
frame = inspect.currentframe().f_back
print(frame.f_locals)
用法:
def main():
a = 1
b = 'hello world'
get_variables()
main()
# output: {'b': 'hello world', 'a': 1}