2011-12-23 34 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') 

但傳遞Thing.id每次我調用該方法只是醜陋的。我期待使用cache.region作爲常規函數,而不是作爲裝飾器,但我找不到任何文檔。沿着線的東西:

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 

甚至更​​多真棒會是這樣的:

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

什麼是最好的方法?

回答

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) 
當然

它會更好,如果我沒有定義的方法內的另一個功能,但是這是很簡單的。