我想在python中构建一个类,它支持从用户提供的源代码动态更新方法。
班级Agent
的实例有一个方法go
。在构造实例时,其.go()
方法不执行任何操作。例如,如果我们a=Agent()
,然后a.go()
,我们应该得到NotImplementedError
或类似的东西。然后,用户应该能够通过提供源代码以交互方式定义a.go()
。一个简单的源代码示例是
mySourceString = "print('I learned how to go!')"
会像这样注入a
a.update(mySourceString)
a.go()
的进一步调用会导致"I learned how to 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)
问题
可能有用的SO帖子