python - 从字符串创建函数对象

标签 python code-generation python-2.x function-object

问题:有没有办法在 python 中使用字符串创建一个函数对象


信息:我正在开发一个将数据存储在 sqlite3 服务器后端的项目。没什么可疯狂的。 DAL 类通常通过代码生成来完成,因为代码非常平凡。但这给了我一个主意。在 python 中,当找不到属性时,如果您定义函数 __getattr__ ,它将在出错之前调用它。所以我想它的方式是,通过解析器和逻辑树,我可以在第一次调用时动态生成我需要的代码,然后将函数对象保存为本地属性。例如:

DAL.getAll()

#getAll() not found, call __getattr__

DAL.__getattr__(self,attrib)#in this case attrib = getAll

##parser logic magic takes place here and I end up with a string for a new function

##convert string to function

DAL.getAll = newFunc

return newFunc

我试过compile函数,但是exec和eval在完成这种壮举方面还差强人意。我需要一些允许多行功能的东西。除了那些不涉及将其写入磁盘的方法之外,还有另一种方法可以做到这一点吗?我再次尝试创建一个动态函数对象

P.S.:是的,我知道这有可怕的安全和稳定性问题。是的,我知道这是一种非常低效的方法。我关心的?不。这是一个概念证明。 “python 能做到吗?它能动态创建一个函数对象吗?”是我想知道的,而不是一些更好的选择。 (不过在你回答完手头的问题后,你可以随意选择更好的选择)

最佳答案

以下将您在字符串中定义的符号放入字典d:

d = {}
exec "def f(x): return x" in d

现在 d['f'] 是一个函数对象。如果您想在字符串的代码中使用程序中的变量,可以通过 d 发送:

d = {'a':7}
exec "def f(x): return x + a" in d

现在 d['f'] 是一个动态绑定(bind)到 d['a'] 的函数对象。当您更改 d['a'] 时,您会更改 d['f']() 的输出。

关于python - 从字符串创建函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6098073/

相关文章:

c# - 解析 C# 代码(作为字符串)并插入其他方法

sqlite - 在运行子进程时按 Ctrl+C 终止 Python 程序

python - 在 Python 2.x 中如何检查输入是字符串还是整数?

python - SQL Server 2017中使用python调用API并存储数据

python - 创建没有多个查询的 Django 表单集

python - 在字符串中的字符之间添加空格

python - 正则表达式 : group function

python - 更正用户消息中的重复字母

java - kotlin 编译器找不到生成的 java 源代码

java - 在 evosuite 测试用例生成中使用 ProjectCP 通配符