我正在使用python中的一个愚蠢的项目来有效地在Web浏览器中实现半REPL,而且我仍然坚持如何在运行中干净地动态评估代码。
基本上,我有一个网页表单,用户输入一个函数,然后在服务器上执行该函数。
预期条目是单个函数,具有已定义的参数。但是,未指定函数名称。
我想要的是获取一个字符串,例如:
def function_for_xxx(param_1, param_2, param_3):
<stuff goes here>
return interesting_value
并以某种方式将其转换为普通的python函数对象(例如<class 'function'>
类型的对象)。
我可以稍微限制一下任务的范围:
目前,我已对compile()
和exec()
次调用进行了一些实验,但它们似乎将exec()
ed代码插入当前的本地范围,即不理想。我真的很喜欢没有类似副作用的exec,只返回一个模块或裸函数。
答案 0 :(得分:1)
好的,我找到了一种有点hackish的解决方法,但做了我想要的。
基本上,我们可以通过指定exec()
参数来利用我们可以为globals
调用指定执行范围这一事实。
func_container = compile(func"\n", "<dynamic_functions_xxx>", "exec")
scope = {
<objects made available to the dynamic function>
}
exec(func_container, scope)
func
字符串中定义的对象现在出现在scope
变量中,对本地名称空间没有任何副作用。
一般评论适用于此处。如果你可以记住编译/执行过程,那么这样做可能是一个好主意(编译很慢!)。