将 exec()/compile() 与用户输入一起使用



如果我使用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)

最新更新