1

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

缺少的部分应该是什么?

提前致谢!!!

4

2 回答 2

3

在 python 中,覆盖可以随时对任何东西进行修补,但如果您只是评估全局命名空间中的一些代码,则存在无意符号冲突的风险。相反,我建议客户提供一个模块,如果在那里定义了函数(否则默认实现),您的代码将调用其中的函数。

也就是说,文档表明:

exec(functions_to_create, globals())
于 2013-08-20T07:00:55.617 回答
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") 导入 o​​s:导入自定义 custom.inject()

这样他们就可以给你他们的代码,你称之为注入,他们可以改变事情。

于 2013-08-20T06:55:58.047 回答