微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果子类来自 Python 字典,则 LRU 缓存不可散列的类型

如何解决如果子类来自 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 举报,一经查实,本站将立刻删除。