我需要将一个来自数据库的输入字符串编译为函数并运行它。这是我目前使用的方法:
假设我已经定义了这个函数:
从数据库中读取的字符串告诉我应该调用这个函数:
然后我创建一个函数(其名称我可以控制),该函数返回我从数据库中读取的函数:
现在我编译这个字符串,并将其设置为稍后用于处理的函数名:
我可以通过运行
我想更了解这个“潜在替代品”。我已经看过AST,但我非常困惑它如何帮助我完成我已经使用上述代码完成的工作。
假设我已经定义了这个函数:
def foo():
print "Yo foo! I am a function!"
从数据库中读取的字符串告诉我应该调用这个函数:
string_from_db = "foo()"
然后我创建一个函数(其名称我可以控制),该函数返回我从数据库中读取的函数:
my_func_string = "def doTheFunc():\n\t return " + string_from_db
现在我编译这个字符串,并将其设置为稍后用于处理的函数名:
exec my_func_string
processor = doTheFunc
我可以通过运行
processor()
稍后调用它,它会惊叫:“Yo foo!我是一个函数!”
我的问题:在这段代码上方有一个注释(由一个失踪的开发人员留下): ###############################################################
# The following method for getting a function out of the text #
# in the database could potentially be replaced by using #
# Python's ast module to obtain an abstract syntax tree and #
# put it inside of a function node #
###############################################################
我想更了解这个“潜在替代品”。我已经看过AST,但我非常困惑它如何帮助我完成我已经使用上述代码完成的工作。
- 我如何使用AST完成同样的事情?或者说AST在这个过程中能为我提供什么帮助?
- 使用AST实现是否更好,为什么?
ast
而不是exec()
。Python 解释器已经实现了将 Python 源代码解析为函数对象,为什么要复制它呢? - millimooseexec
实现,因为我知道我的字符串是安全的。然而,这个问题让我对ast
的更好用法有了更深刻的认识。谢谢! - dinkelk