有条件地禁用基于实例变量的缓存装饰器

时间:2012-12-05 03:00:46

标签: python caching beaker

我想缓存某个类的某些方法 - 但前提是在类的实例上设置了read_only标志。

因此,在下面的对象中,我希望get()方法可以缓存,但前提是self.readonly为True。

我无法有条件地使用装饰器,因为它是在定义类时设置的,而不是在实例化时设置的。

from beaker.cache import cache_regions, cache_region
cache_regions.update({
    'long_term':{
        'expire':86400,
        'type':'dbm',
        'data_dir':'/tmp',
        'key_length': 32,
    }
})

class Foo(object):
  def __init__(self, read_only=True):
    self.read_only = read_only

  @cache_region('long_term')
  def get(self, arg):
    return arg + 1

1 个答案:

答案 0 :(得分:3)

您可以使用装饰器调用右侧(缓存或非缓存)函数来检查所需的属性:

def conditional(decorator):

    def conditional_decorator(fn):
        dec = decorator(fn)
        def wrapper(self, *args, **kw):
             if self.read_only:
                 return dec(self, *args, **kw)
             return fn(self, *args, **kw)
        return wrapper

    return conditional_decorator

像这样使用:

@conditional(cache_region('long_term'))
def get(self, arg):
    return arg + 1