0

使用此测试代码exec(使用 Python 3.4):

vals = {}
exec('def fun(): print("Hello from fun")', vals)
exec('def main(): fun()', vals)
vals['main']()

输出是:

你好来自乐趣

但我没想到这会起作用,因为我假设它funmainwhere 被解释为单独的代码片段,没有公共命名空间来解析mainfun.

那么如何执行main解决对 的引用fun


基于加法的理解问题。使用for和print,很明显这两个函数看到相同的全局变量:idvalsglobals

vals = {}
print('id(vals):', id(vals))
exec('def fun(): print("fun id(globals()):", id(globals())); print("Hello from fun")', vals)
exec('def main(): print("main id(globals()):", id(globals())); fun()', vals)
vals['main']()

这使:

编号(vals):32271016

主ID(全局()):32271016

有趣的 id(globals()): 32271016

你好来自乐趣

因此vals用作 中代码的全局变量exec,从而提供连接,如@Dunes 和其他评论所述。谢谢。

4

1 回答 1

3

通过提供vals这两个exec函数,您已经提供了公共命名空间。to 的第二个参数exec是一个字典,用于在任何执行的代码中进行全局引用。执行第一条语句时,它会创建fun并将其存储在全局命名空间 ( vals) 中。因此,当main尝试查找时fun,它发现它不是局部变量,因此尝试fun在其全局变量中查找(这也是vals)。由于fun存在于vals查找工作和检索和调用的函数中。如果给每个exec自己的dict那么这将行不通。如果您不提供vals,则调用的当前全局变量将exec用作全局变量(因此这仍然有效)。

于 2015-02-27T12:55:55.160 回答