Сегодня утром у меня возникла интересная проблема. У меня был базовый класс, который выглядел так:
# 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 () методом класса для некэшированных моделей?