作为我之前提出的这个问题的后续,我正在尝试执行 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 不使用我传递的局部变量字典?