我有一个班级。在那堂课里,我有一个功能。 在函数中,我有一个字符串变量,它包含几个python函数的定义。
我希望来自函数来创建变量中定义的函数,以便在全局范围中创建它们。
在此操作之后,我希望能够从全局范围调用新函数。
例如:
class MyClass:
def create_functions():
functions_to_create = """
def glob1():
return "G1"
def glob2():
return "G2"
"""
# ----> HERE IS THE MISSING PART, LIKE RUNNING exec in the global scope <----
# The following function should work:
def other_function_in_global_scope():
print "glob1: %s, glob2: %s" % (glob1(), glob2())
缺少部分应该是什么?
提前致谢!!!
答案 0 :(得分:2)
首先要做的几件事。你有什么理由创建一个函数来创建其他函数?你想做什么?可能有更好的方法。另外这里是所谓的创建函数的另一种方法,它不涉及与exec一起玩。
>>> def create_functions():
... global glob1
... def glob1():
... return "G1"
...
>>> glob1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'glob1' is not defined
>>> create_functions()
>>> glob1()
'G1'
>>>
修改强>
在没有exec的情况下注入源代码(这不是一个好主意)
您是否有客户提交他们的代码然后只进行自定义导入
在您希望让客户注入的代码中执行以下操作
导入操作系统 如果os.path.exists(“custom.py”): 导入定制 custom.inject()
通过这种方式,他们可以为您提供他们调用注入的代码,并且可以更改内容。
答案 1 :(得分:2)
在python中,覆盖可以随时修改任何内容,但如果只是评估全局命名空间中的一些代码,那么无意中符号的风险就会发生冲突。我建议客户提供一个模块,如果在那里定义了代码将调用其中的函数(否则默认实现)。
那说,documentation暗示:
exec(functions_to_create, globals())