gpt4 book ai didi

python - exec 不从闭包中获取变量

转载 作者:太空狗 更新时间:2023-10-30 00:07:26 26 4
gpt4 key购买 nike

我有点好奇为什么下面的代码会引发一个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_globalsbar.func_closure 中找到 foo(如果在函数中)。我想我想知道为什么 namespace['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.

因为我同时传入了 globalslocals,所以它的执行就像在一个类中一样。

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

毫不奇怪也不起作用:)。

对于任何对解决方法感兴趣的人,您可以将 namespace 注入(inject)回 namespace['bar'].func_globals1 ( inspired by this ):

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

不错。

1在 python3.x 上它将是 namespace['bar'].__globals__.update

关于python - exec 不从闭包中获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20134417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com