2011-12-23 4 views
0

は、私は次のような構造の複数のクラスを持っている:クラスメソッドのビーカーキャッシュ領域 - デコレータとして使用しないでください。

class Thing(Base): 
    id = Column(Integer, primary_key=True) 

    @cache_region('short_term', 'get_children') 
    def get_children(self, childrentype=None): 
     return DBSession.query()... 

問題はしかし、ビーカーは、キャッシングは無意味な作りにかかわらず、自己の同じ領域でget_childrenを()キャッシュすることです。ハックは:

def get_children(self, id, childrentype=None): 
    ... 

children = thing.get_children(thing.id, 'asdf') 

ですが、私はメソッドを呼び出すたびにちょうど醜いです。私は通常の関数としてデコレータとしてではなく、cache.regionを使用するために探していますが、私はそれに関するドキュメントを見つけることができません。線に沿って何か:

@cache_region('short_term', 'get_children', self.id) 
def get_children(self, childrentype=None): 
    ... 

最善のアプローチは何ですか:

def get_children(self, childrentype=None): 
    if "cached in cache_region(Thing.get_children, 'short_term', 'get_children', self.id, childrentype)": 
     return "the cache" 
    else: 
    query = DBSession.query()... 
    "cache query in cache_region(Thing.get_children', 'short_term', 'get_children', self.id, childrentype)" 
    return query 

、あるいはもっとすごいのようなものでしょうか?

答えて

3

私は遅れています。それはより良い私は、そのメソッドの内部で別の関数を定義する必要がなかったならば、これは十分に簡単ですもちろんの

class Thing(Base): 
    id = ... 

    def get_children(self, childrentype, invalidate=False): 
     if invalidate: 
      region_invalidate(_get_children, None, self.id, childrentype) 

     @cache_region('short_term', 'get_children') 
     def _get_children(id, childrentype): 
      ... 
      return query 

     return _get_children(self.id, childrentype) 

:私のような何かをしなければなりません。