冻结函数参数

时间:2015-12-10 11:28:08

标签: python function object operator-overloading decorator

我正在尝试编写一个提供输入函数功能的类,但是会记住上次调用的参数,并且只会像字典一样更新它们。到目前为止我有这个,但我很想知道是否有更好的方法:

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

所以这就是这样的:

frozenfunc.call(a='theupdatedvalue')

打印:somevalue

org.springframework.dao.InvalidDataAccessApiUsageException: ERR operation not permitted; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR operation not permitted
    at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:44) 

打印:theupdatedvalue

有没有这样的东西我找不到?

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

1 个答案:

答案 0 :(得分: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