Python exec 在通过函数调用时未获取作用域

Python exec not picking up scope when called via a function

我有一个函数 test() 可以检查字符串是否是有效的 Python 文件。 (字符串通常是从自述文件中提取的。)字符串上的 运行 exec() 效果很好,除非在这种情况下:

string = """
import math

def f(x):
    return math.sqrt(x)

f(2.0)
"""

# no problem:
# exec(string)


def test():
    exec(string)

test()  # NameError: name 'math' is not defined
Traceback (most recent call last):
  File "d.py", line 17, in <module>
    test()
  File "d.py", line 15, in test
    exec(string)
  File "<string>", line 7, in <module>
  File "<string>", line 5, in f
NameError: name 'math' is not defined

为什么如果通过函数调用 exec() 不接收 import math,但当 运行 它在主作用域中时有效?如何在 test() 内解决它?

解释起来有点困难,但如果你这样做就可以了:

def test():
    exec(string, {"__MODULE__": "__main__"})

基本上,import math 不存在于 f 函数中,除非它在主作用域中声明。