那里有很多记忆装饰器,但我很好奇如何编写一个支持任意函数签名的记忆装饰器,但让函数决定何时记忆结果?像这样的东西:
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
. 无论如何,有没有聪明的方法来解决这个问题?我总是可以使用类方法和类缓存,只是想看看是否有装饰器模式。