python:如何从用户提供的源代码动态创建绑定方法?

python:如何从用户提供的源代码动态创建绑定方法?,python,dynamically-generated,Python,Dynamically Generated,我想用python构造一个类,支持从用户提供的源代码动态更新方法 类Agent的实例有一个方法go。在构造实例时,其.go()方法不执行任何操作。例如,如果我们执行a=Agent(),然后执行a.go(),我们应该得到一个NotImplementedError或类似的错误。然后,用户应该能够通过提供源代码以交互方式定义a.go()。下面是一个简单的源代码示例 mySourceString=“打印('我学会了如何去!”)” 它会像这样被注入a a.update(mySourceString) 进一

我想用python构造一个类,支持从用户提供的源代码动态更新方法

Agent
的实例有一个方法
go
。在构造实例时,其
.go()
方法不执行任何操作。例如,如果我们执行
a=Agent()
,然后执行
a.go()
,我们应该得到一个
NotImplementedError
或类似的错误。然后,用户应该能够通过提供源代码以交互方式定义
a.go()
。下面是一个简单的源代码示例

mySourceString=
“打印('我学会了如何去!”)”

它会像这样被注入
a
a.update(mySourceString)

进一步调用
a.go()
将导致
“我学会了如何去!”
被打印到屏幕上

我已经部分了解了如何使用以下代码执行此操作:

import types

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class NotImplementedError(Error):
    pass

class Agent(object):
    def go(self):
        raise NotImplementedError()

    def update(self,codeString):
        #Indent each line of user supplied code
        codeString = codeString.replace('\n','\n    ')
        #Turn code into a function called func
        exec "def func(self):\n"+'    '+codeString
        #Make func a bound method on this instance
        self.go = types.MethodType(func, self)
问题

  • 这一实施是否明智
  • 此实现是否会引发意外的范围问题
  • 是否有一种明显的方法来沙盒用户提供的代码,以防止它接触外部对象?我可以想办法通过提供允许的外部对象集来实现这一点,但这似乎不是pythonic
  • 可能有用,所以张贴


  • (我正在使用python 2.6)

    go方法难道不能委托给一个隐藏的内部方法吗?当然,但整个游戏都是从用户提供的源代码中动态构造该方法……我的观点是,添加一层间接寻址,并交换下面层的源代码可能会有好处。这样,如果我在代码中的某个地方引用了
    Agent.go
    foo=Agent.go
    ),那么当我以后调用foo时,它仍然会调用用户最近的代码。注意:已经有一个。不需要自己定义。沙箱很难。我可以很容易地获得外部对象:
    (1)。\uuuuu类\uuuuuuu基\uuuuuuuu[0]。\uuuuu子类\uuuuuuuuuuuuuuuuu()
    为我获取解释器中每个类的列表