我遇到了一些相关的答案,但不是我想要的。
这是我现在拥有的代码:
code_str = """
print "this is my global x = " + x
print "And another line is done"
"""
x = 'mystery'
func_template = lambda p: None
func_template.__code__ = compile(code_str, '<string>', 'exec')
func_template() # this executes fine and also has access to x, which i do need.
# func_template('param') # This raises: TypeError: <module>() takes no arguments (1 given)
一些背景;code_str 将来自数据库,我需要在 dict 中存储大量函数,以便可以按名称调用任何函数,如下所示:
all_funcs = {}
# Assuming db_result returns a list of name, code tuples from the databse
for name, code in db_result:
all_funcs[name] = my_compile(code)
如果我知道名称,我想用我想要的参数调用所需的函数:
result = all_funcs[by_name](arg1, arg2)
编辑: 数据库是可信的,所以我不需要清理或担心恶意代码。