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

时间:2013-05-15 18:48:36

标签: python dynamically-generated

我想在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)

问题

  1. 这种做法是否合理?
  2. 此实施是否会引发意外的范围问题?
  3. 是否有一种明显的方法来沙箱用户提供的代码以防止它接触外部对象?我可以想办法通过提供一组允许的外部对象来实现这一点,但这似乎不是pythonic。
  4. 可能有用的SO帖子

    1. What's the difference between eval, exec, and compile in Python?
    2. Adding a Method to an Existing Object
    3. (我在python 2.6中工作)

0 个答案:

没有答案