是否可以functools.lru_cache
用于缓存由创建的部分函数functools.partial
?
我的问题是一个函数,它接受可散列的参数和持续的、不可散列的对象,例如 NumPy 数组。
考虑这个玩具示例:
import numpy as np
from functools import lru_cache, partial
def foo(key, array):
print('%s:' % key, array)
a = np.array([1,2,3])
由于 NumPy 数组不可散列,这将不起作用:
@lru_cache(maxsize=None)
def foo(key, array):
print('%s:' % key, array)
foo(1, a)
正如预期的那样,您会收到以下错误:
/Users/ch/miniconda/envs/sci34/lib/python3.4/functools.py in __init__(self, tup, hash)
349 def __init__(self, tup, hash=hash):
350 self[:] = tup
--> 351 self.hashvalue = hash(tup)
352
353 def __hash__(self):
TypeError: unhashable type: 'numpy.ndarray'
所以我的下一个想法是用来functools.partial
摆脱 NumPy 数组(无论如何它都是不变的)
pfoo = partial(foo, array=a)
pfoo(2)
所以现在我有一个只接受可散列参数的函数,应该非常适合lru_cache
. 但是lru_cache
在这种情况下可以使用吗?我不能将它用作包装函数而不是@lru_cache
装饰器,可以吗?
有没有聪明的方法来解决这个问题?