如何在python中从全局范围运行“exec”

时间:2013-08-20 06:49:41

标签: python

我有一个班级。在那堂课里,我有一个功能。 在函数中,我有一个字符串变量,它包含几个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())

缺少部分应该是什么?

提前致谢!!!

2 个答案:

答案 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的情况下注入源代码(这不是一个好主意

您是否有客户提交他们的代码然后只进行自定义导入

  1. 客户提交代码
  2. 将该代码另存为custom.py
  3. 在您希望让客户注入的代码中执行以下操作

    导入操作系统 如果os.path.exists(“custom.py”):     导入定制     custom.inject()

  4. 通过这种方式,他们可以为您提供他们调用注入的代码,并且可以更改内容。

答案 1 :(得分:2)

在python中,覆盖可以随时修改任何内容,但如果只是评估全局命名空间中的一些代码,那么无意中符号的风险就会发生冲突。我建议客户提供一个模块,如果在那里定义了代码将调用其中的函数(否则默认实现)。

那说,documentation暗示:

exec(functions_to_create, globals())