exec不会从闭包中获取变量

mgi*_*son 6 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']()
Run Code Online (Sandbox Code Playgroud)

在正常水平的解释,我们可以发现foobar.func_globalsbar.func_closure如果在一个功能.我想我不知道为什么namespace['bar']不把foofunc_closure...

mgi*_*son 4

事实证明,答案一直在文档中:

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

由于我同时传递了globalsand locals,因此它的执行就像在类中一样。

class Foo(object):
    foo = [1,2,3]
    @staticmethod
    def bar():
       return foo[1]
Run Code Online (Sandbox Code Playgroud)

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

对于任何对解决方法感兴趣的人,您可以注入namespacenamespace['bar'].func_globals1受此启发):

>>> namespace['bar'].func_globals.update(namespace)
>>> namespace['bar']()
2
Run Code Online (Sandbox Code Playgroud)

好的。

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