在 python 中即时从字符串编译函数?

Compile function from string on-the-fly in python?

我正在 python 中从事一个愚蠢的项目,该项目有效地在网络浏览器中实现半 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 的完成没有那样的副作用,只是 return 一个模块或裸函数。

好吧,我想出了一个变通办法,虽然有点老套,但可以满足我的要求。

基本上,我们可以利用这样一个事实,即我们可以通过指定 globals 参数来指定 exec() 调用的执行范围。

func_container = compile(func"\n", "<dynamic_functions_xxx>", "exec")

scope = {
    <objects made available to the dynamic function>
}
exec(func_container, scope)

func 字符串中定义的对象现在出现在 scope 变量中,对本地命名空间没有副作用。

此处适用一般评论。如果你能记住 compile/exec 过程,这样做可能是个好主意(编译很慢!)。