3

クラスの特定のメソッドをキャッシュしたい - ただし、read_onlyクラスのインスタンスにフラグが設定されている場合のみ。

したがって、以下のオブジェクトでは、メソッドをキャッシュ可能にしたいのですが、 True のget()場合のみです。self.readonly

インスタンス化されたときではなく、クラスが定義されたときに設定されるため、デコレータを条件付きで使用することはできません。

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
4

1 に答える 1

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
于 2012-12-05T03:40:34.500 に答える