python – exec不会从闭包中获取变量

我有点好奇为什么以下代码引发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']()

在正常的解释器级别,我们可以在bar.func_globals中找到foo,或者在函数中找到bar.func_closure.我想我想知道为什么命名空间[‘bar’]没有把foo放在func_closure中…

最佳答案
事实证明,答案始终存在于docs

If two separate objects are given as globals and locals, the code will be executed as if it were embedded in a class definition.

因为我传入全局变量和本地变量,所以它就像在类中一样执行.

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

毫不奇怪,也不工作:).

对于任何对变通方法感兴趣的人,可以将命名空间注入命名空间[‘bar’].func_globals1(inspired by this):

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

尼斯.

1它将是python3.x上的命名空间[‘bar’] .__ globals __.update

转载注明原文:python – exec不会从闭包中获取变量 - 代码日志