问题:在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
我已经尝试了编译函数,但exec和eval在能够完成这种任务方面远非令人满意。我需要一些可以允许多行函数的东西。除了那些涉及将它写入磁盘的方法外,是否还有其他方法可以实现此目的?再次强调,我正在尝试动态创建函数对象。P.S.:是的,我知道这会带来严重的安全和稳定性问题。是的,我知道这是一个可怕的低效率的做法。但我不在乎。这是一个概念验证。我想知道“Python能否做到这一点?它能动态创建函数对象吗?”而不是一些更好的替代方案。(当然,在回答问题后,请自由附上更好的替代方案)
exec
完全可以做到。你遇到了什么具体的错误或问题? - S.Lottexec
只是运行代码,它们按照字面意思执行。a = eval("123")
将 123 绑定到a
上。你会得到表达式的值。 - Skurmedelcodeop
库或py_compile
的东西。例如:exec(codeop.compile_command("import os; print(os.getcwd())"))
- Skurmedelexec
函数没有返回任何东西,它只是用来创建函数。在运行exec
之后,该函数就被创建出来了,你可以直接使用它。 - S.Lott