gpt4 book ai didi

python-3.x - 在 python 中即时编译字符串函数?

转载 作者:行者123 更新时间:2023-12-04 17:53:24 28 4
gpt4 key购买 nike

我正在用 python 开发一个愚蠢的项目,它可以在网络浏览器中有效地实现半 REPL,而且我一直在研究如何干净利落地动态评估代码。

基本上,我有一个网络表单,用户可以在其中输入一个函数,然后该函数应该在服务器上执行。

预期的条目是一个函数,具有已定义的参数。但是,未指定函数名称。

我想要的是得到一个字符串,比如:

def function_for_xxx(param_1, param_2, param_3):
<stuff goes here>
return interesting_value

并以某种方式将其转换为普通的 python 函数对象(例如 <class 'function'> 类型的对象)。

我可以稍微限制任务的范围:

  • 用户明确受信任,所以我不必担心清理问题。
  • 有一些环境函数应该传递到函数全局变量中,但我可以明确指定它们。
  • 强制字符串成为一个单一的裸函数实际上是可取的。

现在,我对 compile() 做了一些试验和 exec()调用,但它们似乎插入了 exec()将代码编辑到当前本地范围,这是不理想的。我真的很希望 exec 的执行没有那样的副作用,并且只返回一个模块或裸函数。

最佳答案

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

基本上,我们可以通过指定 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 变量中,对本地命名空间没有副作用。

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

关于python-3.x - 在 python 中即时编译字符串函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477507/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com