Следующая функция предназначена для использования в качестве декоратора, который сохраняет результаты уже вычисленных значений. Если аргумент уже был рассчитан ранее, функция вернет значение, хранящееся в словаре cache
:
def cached(f):
f.cache = {}
def _cachedf(*args):
if args not in f.cache:
f.cache[args] = f(*args)
return f.cache[args]
return _cachedf
Я понял (по ошибке ), что cache
не обязательно должен быть атрибутом функционального объекта. Фактически, следующий код также работает:
def cached(f):
cache = {} # <---- not an attribute this time!
def _cachedf(*args):
if args not in cache:
cache[args] = f(*args)
return cache[args]
return _cachedf
Мне трудно понять, как объект cache
может быть постоянным при нескольких вызовах. Я несколько раз пытался вызвать несколько кэшированных функций и не смог найти никаких конфликтов или проблем.
Может ли кто-нибудь помочь мне понять, как переменная cache
все еще существует даже после возврата функции _cachedf
?