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デコレータの代わりにラッピング関数として使用することはできませんか?
これを解決する賢い方法はありますか?