我有点好奇为什么以下代码会引发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']()
在正常的口译员级别,如果在某个功能中,我们可以在foo
或bar.func_globals
中找到bar.func_closure
。我想我想知道为什么namespace['bar']
未将foo
放入func_closure
......
答案 0 :(得分:4)
事实证明,答案一直存在于docs:
中如果给出两个单独的对象作为全局变量和局部变量,则代码将被执行,就像它嵌入在类定义中一样。
由于我传入了globals
和locals
,因此它就像在一个类中一样执行。
class Foo(object):
foo = [1,2,3]
@staticmethod
def bar():
return foo[1]
毫不奇怪也不起作用:)。
对于对解决方法感兴趣的任何人,您可以将namespace
注入namespace['bar'].func_globals
1 (inspired by this):
>>> namespace['bar'].func_globals.update(namespace)
>>> namespace['bar']()
2
尼斯。
1 在python3.x上它是namespace['bar'].__globals__.update