使用内部状态模拟功能

时间:2017-07-04 16:04:33

标签: python lambda partial-application

我有一个有效的解决方案,但我正在寻找更简单的方法。

我有一个封装了一个函数的类,用户可以向它传递一个函数(lambda表达式)。这些函数总是采用一个输入数据参数和任意数量的用户定义的自定义参数:

c.set_func(lambda x, offset, mul: mul*(x**2 + offset), offset=3, mul=1)

然后,用户可以调用一个类方法,该方法将使用预定义的输入和当前设置的custom-arguments运行该函数。用户还可以通过更改类的属性来更改自定义参数。

这是我的代码:

from functools import partial

class C:
    def __init__(self):
        self.data = 10 # just an example
        self.func = None
        self.arg_keys = []

    def set_func(self, func, **kwargs):
        self.func = func

        for key, value in kwargs.iteritems():
            # add arguments to __dict__
            self.__dict__[key] = value
            self.arg_keys.append(key)
        # store a list of the argument names
        self.arg_keys = list(set(self.arg_keys))

    def run_function(self):
        # get all arguments from __dict__ that are in the stored argument-list
        argdict = {key: self.__dict__[key] for key in self.arg_keys} 
        f = partial(self.func, **argdict)
        return f(self.data)


if __name__ == '__main__':
    # Here is a testrun:
    c = C()
    c.set_func(lambda x, offset, mul: mul*(x**2 + offset), offset=3, mul=1)

    print c.run_function()
    # -> 103

    c.offset = 5
    print c.run_function()
    # -> 105

    c.mul = -1
    print c.run_function()
    # -> -105

重要的部分是:

  • 用户最初可以使用任意数量的参数设置函数
  • 这些参数的值将被存储,直到更改为

是否有内置或其他更简单的解决方案?

0 个答案:

没有答案