Украшение метода, который уже является классовым методом?

Сегодня утром у меня возникла интересная проблема. У меня был базовый класс, который выглядел так:

# base.py
class Base(object):

    @classmethod
    def exists(cls, **kwargs):
        # do some work
        pass

И модуль декоратора, который выглядел так:

# caching.py

# actual caching decorator
def cached(ttl):
    # complicated

def cached_model(ttl=300):
    def closure(model_class):
        # ...
        # eventually:
        exists_decorator = cached(ttl=ttl)
        model_class.exists = exists_decorator(model_class.exists))

        return model_class
    return closure

Вот моя модель подкласса:

@cached_model(ttl=300)
class Model(Base):
    pass

Дело в том, когда я на самом деле вызываю Model.существует, я получаю жалобы на неправильное количество аргументов! Проверка аргументов в декораторе не показывает ничего странного - аргументы именно то, что я ожидал, и они совпадают с сигнатурой метода. Как я могу добавить дополнительные декораторы к методу, который уже оформлен с помощью classmethod ?

Не все модели кэшируются, но метод exists () присутствует в каждой модели как метод класса, поэтому измените порядок декораторы - это не вариант: cached_model может добавить метод класса в exists (), но тогда что делает exists () методом класса для некэшированных моделей?

6
задан martineau 16 May 2017 в 14:57
поделиться