関連する回答はほとんど見つかりませんでしたが、私が望むものではありませんでした。
ここに私が今持っているコードがあります:
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)
編集: データベースは信頼されているため、悪意のあるコードを消毒したり心配したりする必要はありません。