在 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 过程,这样做可能是个好主意(编译很慢!)。
我正在 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 过程,这样做可能是个好主意(编译很慢!)。