【问题标题】:Reading a parent's scope in python在python中读取父母的范围
【发布时间】:2012-07-18 15:56:17
【问题描述】:

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

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 的范围吗?

【问题讨论】:

  • 那里有示例代码。你可以试试看。
  • @arxanas 我的示例代码没有这样做,但它确实说明了问题,请参见第 10 行。
  • 注意f()的本地也包括函数g

标签: python scope local-variables


【解决方案1】:

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

请注意,使用inspect 将使您能够进入调用堆栈,而不是词法范围堆栈。如果你从f()返回gf的范围就会消失,所以根本没有办法访问它,因为它根本不存在。

【讨论】:

  • 不能这样做是出于安全原因吗?我发现范围如此微妙/令人困惑,但是一旦您从f 中调用gf 的范围肯定仍然“存在”,因为之后您返回执行到f(!)我在想的原因这是为了unit testing for side-effects... :s
  • @hayden:不,这不是出于安全原因。正如我所说,如果您的 Python 实现支持堆栈帧,您可以向上调用堆栈 - 只需执行 inspect.currentframe().f_back.f_locals 之类的操作来获取调用帧的本地变量,这将是 @987654334 的实例@在你的例子中。您不能从 lexical 范围访问变量的原因是这个概念没有意义。调用堆栈中可以有多个 f 实例,它们都具有不同的本地变量,或者根本没有。
  • 不应该做这样的事情的原因是违背了词汇范围与动态范围相对的编程语言的要点(也就是说,实际上任何编程语言)。有关详细信息,请参阅en.wikipedia.org/wiki/…
  • 我认为这里让我感到困惑的是g确实可以访问f的变量(e.g.)......但我们只是可以' t 显示它们。
  • @hayden: g() 无权访问fb,除非您使用堆栈帧自检,因为它被gb 隐藏。一旦你真正关闭了f 的一些名称,它们就会附加到闭包上,所以你可以通过自省来访问它们。但是您的代码实际上并没有从f 访问任何名称,因此它不会产生闭包。
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2016-10-10
相关资源
最近更新 更多