Есть много украшений для заметок, но мне любопытно, как можно написать декоратор memoization, который поддерживает произвольные сигнатуры функций, но позволяет функции решить, когда memoize результат? Что-то вроде этого:Условная память?
def conditional_memoize(f):
cache = {}
@wraps(f)
def conditional_f(*args, **kwargs):
return f(*args, **kwargs)
return conditional_f
@conditional_memoize
def my_func(a, b, c):
if str(a) + str(b) + str(c) in cache:
return cache[str(a) + str(b) + str(c)]
res = # compute the result
if some_arbitrary_condition:
cache[str(a) + str(b) + str(c)] = res
return res
Однако, я знаю, что это не будет работать из-за NameError
. Есть ли умный подход к проблеме в любом случае? Я всегда мог использовать метод класса и кеш-класс, просто хотел посмотреть, есть ли для этого шаблон декоратора.
Как функция должна сообщать о своем желании получить кеш-результат или нет? – martineau