在python中读取父级的作用域

Reading a parent's scope in python

假设我有一个函数层次结构,我希望能够访问(而不是更改!)父级范围。下面是一个示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def f():
    a = 2
    b = 1
    def g():
        b = 2
        c = 1
        print globals() #contains a=1 and d=4
        print locals() #contains b=2 and c=1, but no a
        print dict(globals(), **locals()) #contains a=1, d=4 (from the globals), b=2 and c=1 (from g)
        # I want a=2 and b=1 (from f), d=4 (from globals) and no c
    g()
a = 1
d = 4
f()

我可以从g内访问f的范围吗?


一般来说,不能用Python。如果您的python实现支持堆栈帧(cpython支持),那么您可以使用inspect模块检查调用函数的帧,并提取局部变量,但我怀疑这是解决您想要解决的问题(无论是什么问题)的最佳解决方案。如果你认为你需要的话,你的设计可能有一些缺陷。

请注意,使用inspect将使您能够在调用堆栈中上升,而不是在词汇范围的堆栈中上升。如果从f()返回gf的范围将消失,因此根本无法访问它,因为它甚至不存在。