python:如何从用户提供的源代码动态创建绑定方法?
我想用python构造一个类,支持从用户提供的源代码动态更新方法 类python:如何从用户提供的源代码动态创建绑定方法?,python,dynamically-generated,Python,Dynamically Generated,我想用python构造一个类,支持从用户提供的源代码动态更新方法 类Agent的实例有一个方法go。在构造实例时,其.go()方法不执行任何操作。例如,如果我们执行a=Agent(),然后执行a.go(),我们应该得到一个NotImplementedError或类似的错误。然后,用户应该能够通过提供源代码以交互方式定义a.go()。下面是一个简单的源代码示例 mySourceString=“打印('我学会了如何去!”)” 它会像这样被注入a a.update(mySourceString) 进一
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)
问题
(我正在使用python 2.6)go方法难道不能委托给一个隐藏的内部方法吗?当然,但整个游戏都是从用户提供的源代码中动态构造该方法……我的观点是,添加一层间接寻址,并交换下面层的源代码可能会有好处。这样,如果我在代码中的某个地方引用了
Agent.go
(foo=Agent.go
),那么当我以后调用foo时,它仍然会调用用户最近的代码。注意:已经有一个。不需要自己定义。沙箱很难。我可以很容易地获得外部对象:(1)。\uuuuu类\uuuuuuu基\uuuuuuuu[0]。\uuuuu子类\uuuuuuuuuuuuuuuuu()
为我获取解释器中每个类的列表