【问题标题】:Conditionally disable caching decorator based on instance variable根据实例变量有条件地禁用缓存装饰器
【发布时间】:2012-12-05 11:45:24
【问题描述】:

我想缓存某个类的某些方法 - 但前提是在该类的实例上设置了 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

【问题讨论】:

    标签: python caching beaker


    【解决方案1】:

    您可以使用装饰器调用正确的(缓存与否)函数来检查所需的属性:

    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
    

    【讨论】:

    • 装饰器是在定义方法时调用还是在调用方法时调用?
    • @ʞɔıu 它在定义时被调用,但它存储原始方法(如fn)和修饰的方法(如dec)。当wrapper被调用(实际方法)时,它根据self.read_only来决定使用哪一个
    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 2013-02-03
    • 2021-05-15
    • 1970-01-01
    • 2021-08-20
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多