0

作为我之前提出的这个问题的后续,我正在尝试执行 Python 代码,就好像它在外部函数的上下文中一样。我通过简单地用 包装一段代码def outer():,并进行一些简单的字符串处理以正确缩进内部代码来做到这一点。然后我编译它并通过执行co_consts列表中的第一个代码对象来执行编译的内部代码。

例子:

mycode = """
print("Hey!")
"""

wrapped_code = 'def outer():\n    ' + '\n    '.join(mycode.strip().split('\n'))
compiled_code = compile(wrapped_code, '<str>', 'exec')
exec(compiled_code.co_consts[0], {}, {})

print("Hey")从外部函数的上下文中执行代码。(如果有人想知道我为什么要这样做,它是我一直在研究的 C 扩展模块的一部分。)

问题:我遇到的一个问题是,如果我将代码包装在外部函数中,然后执行内部函数代码块,我似乎无法将任何局部变量传递给执行上下文。

mycode = """
print(locals())
"""

wrapped_code = 'def outer():\n    ' + '\n    '.join(mycode.strip().split('\n'))
compiled_code = compile(wrapped_code, '<str>', 'exec')
exec(compiled_code.co_consts[0], {}, {"foo" : "bar"})

这输出:

{}

请注意,我明确传递了一个包含{"foo" : "bar"}to的本地字典exec,但是当它实际执行代码并打印locals()时,它显示一个空字典。为什么 Python 不使用我传递的局部变量字典?

4

1 回答 1

0

您将一个函数作为第一个参数传递给 exec。一个函数将定义它自己的局部变量,这就是您要打印的局部变量。去掉包装(我看不出有什么用处),它就可以工作了。

于 2013-04-01T10:44:16.110 回答