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