0

我有一个函数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 mathif ,而是在主范围内运行它时工作?如何解决它test()

4

1 回答 1

1

正确解释有点困难,但如果你这样做,它会起作用:

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

基本上,除非在主范围中声明,否则函数import math中不存在。f

于 2020-07-11T15:34:45.650 回答