如果我用 compile() 和 exec() 要执行用户输入的某些代码,代码中定义的函数或变量能否在外部再次使用? 例如:
compile()
exec()
code = "" while 1: line = input("") if line == "": break code += line exec(compile(code, "code", "exec")) print(test()+1)
这不会再回来了 6 就像我预料的那样。它给人一种感觉 NameError 但是编译或执行代码没有问题。如果代码只是一个字符串而不是输入,则没有错误。有什么方法可以使用这个函数吗 test() ?
6
NameError
test()
变量名解析和作用域是在编译时完成的,因此如果在运行时使用 exec ,则需要使用 locals()
exec
locals()
exec(compile(code, "code", "exec")) print(locals()['test']()+1)