我有一个有效的解决方案,但我正在寻找更简单的方法。
我有一个封装了一个函数的类,用户可以向它传递一个函数(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
重要的部分是:
是否有内置或其他更简单的解决方案?