2015-12-10 29 views
1

我想写一个给出输入函数功能的类,但记得上次调用的参数,并且只会像字典一样更新它们。我有这到目前为止,但我很想知道是否有更好的办法:冻结函数参数

class freezefunc: 
    def __init__(self, func, **funcargs): 
     self.func = func 
     self.funcargs = {} 

    def call(self, **kwargs): 
     self.funcargs.update(kwargs) 
     self.func(**self.funcargs) 

因此,这是这样的,那么:

def func(a): 
    print a 
frozenfunc = freezefunc(func) 
frozenfunc.call(a='somevalue') 

打印:someValue中

frozenfunc.call(a='theupdatedvalue') 

打印:更新值

有没有这样的东西,我只是没有找到?

UPDATDE:来自库functools的函数partial执行非常相同的任务。

+0

的情况下,任何人有建议,以改善标题或标签这个问题,使之更加有用,我感谢的建议。 – pindakaas

回答

2

特殊方法__call__,您可以拨打frozenfunc,直接:

class freezefunc: 
    def __init__(self, func, **funcargs): 
     self.func = func 
     self.funcargs = {} 

    def __call__(self, **kwargs): 
     self.funcargs.update(kwargs) 
     return self.func(**self.funcargs) 

def func(a): 
    print(a) 

现在:

frozenfunc = freezefunc(func) 
frozenfunc(a='somevalue') 

打印:

somevalue 

和:

frozenfunc(a='theupdatedvalue') 

打印:

theupdatedvalue 
+0

对不起,想在这里评论:哇,这很酷^^ – pindakaas

+1

是的,运算符重载(这是经常被称为)是很好的。顺便说一句,你可以[接受](http://stackoverflow.com/help/accepted-answer)一个答案,如果它解决了你的问题。 –

+0

我刚刚意识到,如果我不在self.func(** self.funcargs)之前添加返回它不起作用。这是为什么?因为return语句返回到'__call__'方法? – pindakaas