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):
    ...

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

4

1 に答える 1

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)

もちろん、そのメソッド内で別の関数を定義する必要がない方がよいでしょうが、これは十分に単純です。

于 2011-12-23T02:36:18.937 に答える