2013-11-22 12 views
6

我有点好奇为什么下面的代码会产生一个NameErrorexec不会从关闭中提取变量

>>> 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_globalsfoobar.func_closure如果一个函数。我想我不知道为什么namespace['bar']不把foofunc_closure ...

回答

4

事实证明,答案是那里的docs一直:

如果两个不同的对象给定为全局和本地代码,代码将被执行,就好像它被嵌入到类定义中一样。

由于我通过了globalslocals,它就像在一个类中一样执行。

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

不出意外也不能工作:)。

任何有兴趣的解决方法,你可以注入namespacenamespace['bar'].func_globalsinspired by this):

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

尼斯。

这将是namespace['bar'].__globals__.update上python3.x