exec不会从闭包中获取变量

时间:2013-11-22 00:00:46

标签: python closures exec python-2.x

我有点好奇为什么以下代码会引发NameError

>>> s = """
... foo = [1,2,3]
... def bar():
...    return foo[1]
... """
>>> namespace = {}
>>> exec(s, {'__builtins__': None}, namespace)
>>> print namespace
{'foo': [1, 2, 3], 'bar': <function bar at 0x7f79871bd0c8>}
>>> namespace['bar']()

在正常的口译员级别,如果在某个功能中,我们可以在foobar.func_globals中找到bar.func_closure。我想我想知道为什么namespace['bar']未将foo放入func_closure ......

1 个答案:

答案 0 :(得分:4)

事实证明,答案一直存在于docs

  

如果给出两个单独的对象作为全局变量和局部变量,则代码将被执行,就像它嵌入在类定义中一样。

由于我传入了globalslocals,因此它就像在一个类中一样执行。

class Foo(object):
    foo = [1,2,3]
    @staticmethod
    def bar():
       return foo[1]

毫不奇怪也不起作用:)。

对于对解决方法感兴趣的任何人,您可以将namespace注入namespace['bar'].func_globals 1 inspired by this):

>>> namespace['bar'].func_globals.update(namespace)
>>> namespace['bar']()
2

尼斯。

1 在python3.x上它是namespace['bar'].__globals__.update