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

时间:2017-02-27 03:47:33

标签: python-3.x dynamic on-the-fly

我正在使用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,只返回一个模块或裸函数。

1 个答案:

答案 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变量中,对本地名称空间没有任何副作用。

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