如何解决如果子类来自 Python 字典,则 LRU 缓存不可散列的类型
我想弄清楚为什么下面的代码不起作用
from functools import lru_cache
import numpy as np
class Mask(dict):
def __init__(self,shape,data = None):
super().__init__(data)
self.shape = shape
@lru_cache(maxsize=1)
def tomatrix(self):
dense = np.zeros(self.shape[0] * self.shape[1])
for uid,entries in self.items():
dense[entries] = uid
return np.reshape(dense,self.shape)
cells = {i : np.arange(i * 10,(i + 1) * 10) for i in range(10)}
mask = Mask((10,10),cells)
r1 = mask.tomatrix()
r2 = mask.tomatrix()
错误说
TypeError: unhashable type: 'Mask'
好像 lru_cache
试图在 self
中缓存 self.tomatrix()
。
另一方面,如果我不从 dict
继承子类,而是有一个存储实际数据的内部成员 self.data
,LRU 包装器不会抱怨。
有效的代码:
from functools import lru_cache
import numpy as np
class Mask:
def __init__(self,data = None):
self.data = data
self.shape = shape
@lru_cache(maxsize=1)
def tomatrix(self):
dense = np.zeros(self.shape[0] * self.shape[1])
for uid,entries in self.data.items():
dense[entries] = uid
return np.reshape(dense,cells)
r1 = mask.tomatrix()
r2 = mask.tomatrix()
谁能帮我解开这个谜?我想继续从 dict
继承子类,我需要使用 LRU 缓存。
解决方法
解决方案是获取为继承自 __hash__
的用户类定义的默认 object
函数。 dict
定义了自己的 __eq__
,但没有 __hash__
因此被阻止。
添加行
__hash__ = object.__hash__
到 Mask(dict)
有效。
非常感谢 this 对另一个问题的回答!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。