области кэша мензурки для методов класса - использовать его не как декоратор? - PullRequest
0 голосов
/ 23 декабря 2011

У меня есть несколько классов следующей структуры:

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

Каков наилучший подход?

1 Ответ

3 голосов
/ 23 декабря 2011

Я отсталый.Я должен делать что-то вроде:

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)

конечно, было бы лучше, если бы мне не нужно было определять другую функцию внутри этого метода, но это достаточно просто.

...