我试图在Python中将可选参数传递给类修饰器。
下面是我目前拥有的代码:

class Cache(object):
    def __init__(self, function, max_hits=10, timeout=5):
        self.function = function
        self.max_hits = max_hits
        self.timeout = timeout
        self.cache = {}

    def __call__(self, *args):
        # Here the code returning the correct thing.


@Cache
def double(x):
    return x * 2

@Cache(max_hits=100, timeout=50)
def double(x):
    return x * 2

第二个具有覆盖默认值的参数的修饰器(max_hits=10, timeout=5在my__init__函数中)不工作,我得到了异常。我尝试了很多解决方案并阅读了相关的文章,但在这里我仍然无法使它发挥作用。
有办法解决这个问题吗?谢谢!

最佳答案

@Cache(max_hits=100, timeout=50)调用__init__(max_hits=100, timeout=50),因此您不满足function参数。
可以通过检测函数是否存在的包装方法来实现装饰器。如果找到一个函数,它可以返回缓存对象。否则,它可以返回将用作修饰器的包装函数。

class _Cache(object):
    def __init__(self, function, max_hits=10, timeout=5):
        self.function = function
        self.max_hits = max_hits
        self.timeout = timeout
        self.cache = {}

    def __call__(self, *args):
        # Here the code returning the correct thing.

# wrap _Cache to allow for deferred calling
def Cache(function=None, max_hits=10, timeout=5):
    if function:
        return _Cache(function)
    else:
        def wrapper(function):
            return _Cache(function, max_hits, timeout)

        return wrapper

@Cache
def double(x):
    return x * 2

@Cache(max_hits=100, timeout=50)
def double(x):
    return x * 2

10-07 21:02