2013-11-22 11 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