访问调用函数的变量

时间:2018-05-03 09:54:07

标签: python variables scope

以下代码

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对象能够获取另一个函数的局部变量的名称,但不能对它们做任何事情。我该如何解决这个问题?

背景。这个问题是出于调试目的。我希望能够显示有关在我的代码中创建的变量的信息。

2 个答案:

答案 0 :(得分:0)

为函数定义局部变量。因此,只要定义了函数,解释器就会知道"将有2个局部变量,名为ab。当函数被调用时,对内存分配很有用。把它想象成一幅蓝图。

然后,当您尝试eval某个字符串时,它会使用locals()所在位置的上下文(globals()eval)来执行此操作。 您在该范围内没有任何a。因此,它失败了,因为它没有定义。

答案 1 :(得分:0)

  • 使用inspect.currentframe获取堆栈框架对象
  • 使用f_back属性
  • 将调用堆栈向上移动1帧
  • 通过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}