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

2024-03-29 11:26:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我要上课。在那个类中,我有一个函数。 在函数中,我有一个string变量,它保存了几个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())

缺少的部分应该是什么?在

提前谢谢!!!在


Tags: 函数instringreturn定义defcreatefunction
2条回答

在python中,重写可以在任何时候修补任何内容,但是如果您只是在全局名称空间中计算一点代码,意外的符号冲突的风险就存在了。相反,我建议客户提供一个模块,如果在其中定义了函数,那么代码将调用其中的函数(否则为默认实现)。在

也就是说,documentation表明:

exec(functions_to_create, globals())

先做几件事。你为什么要创建一个函数来创建其他函数?你想干什么?也许还有更好的办法。这里还有另一种方法叫做create function,它不需要和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. 把代码存起来自定义.py在
  3. 在您希望让客户注入的代码中执行以下操作

    导入操作系统 如果os.path.exists("自定义.py"): 导入自定义 自定义.注入()

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

相关问题 更多 >