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)
在正常水平的解释,我们可以发现foo在bar.func_globals或bar.func_closure如果在一个功能.我想我不知道为什么namespace['bar']不把foo中func_closure...
事实证明,答案一直在文档中:
如果两个单独的对象被指定为全局对象和局部对象,则代码将像嵌入在类定义中一样执行。
由于我同时传递了globalsand locals,因此它的执行就像在类中一样。
class Foo(object):
foo = [1,2,3]
@staticmethod
def bar():
return foo[1]
Run Code Online (Sandbox Code Playgroud)
毫不奇怪也不起作用:)。
对于任何对解决方法感兴趣的人,您可以注入namespace回namespace['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 上