那里有很多记忆化装饰器,但我很好奇如何编写一个支持任意函数签名的记忆化装饰器,但让函数决定何时内存结果?像这样的事情:
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
,这不会起作用。无论如何,有一个聪明的方法来解决这个问题吗?我总是可以使用类方法和类缓存,只是想看看是否有一个装饰器模式。
最佳答案
让函数返回其所需的结果和指示是否应缓存结果的标志,或者让包装器将缓存对象传递给函数。 (或两者兼而有之!)无论哪种方式都可以,但我更喜欢第一种方法。也许是这样的......
import functools
def conditional_memoize(fn):
cache = {}
@functools.wraps(fn)
def wrapper(*args, **kwargs):
key = args + tuple(sorted(kwargs.iteritems()))
if key in cache:
return cache[key]
result, flag = fn(*args, **kwargs)
if flag:
cache[key] = result
return result
return wrapper
关于python - 有条件内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19599439/