我正在尝试为一些计算科学代码结合数据类、属性和 lru_caches:from dataclasses import dataclassfrom typing import Anyfrom functools import lru_cache@dataclassclass F: a: Any = 1 b: Any = 2 c: Any = 3 @property @lru_cache(1) def d(self): print('Computing d') return (self.a+self.b)**self.cf=F()print(f.d)print(f.d)我希望看到Computing d2727但得到TypeError: unhashable type: 'F'有没有办法解决这个问题?
1 回答

慕森王
TA贡献1777条经验 获得超3个赞
lru_cache
就像记忆一样,它对传递给函数的参数进行哈希处理并存储结果。您的课程不可散列。要使其可散列,请添加类似这样的内容
class F: .... def __hash__(self): return hash((self.a, self.b, self.c))
这样做的原因是这 3 个属性使每个实例“唯一”——我们不需要对方法进行散列,因为所有实例都具有相同的方法。
在大多数普通类上,它__dict__
用于一般散列,除非__hash__
找到方法。数据类文档解释说数据类可以生成散列方法,但这取决于您如何设置数据类,因为默认情况下假定对象是可变的(并且不能对列表等可变对象进行散列)。
数据类文档指出,如果参数eq
和frozen
设置为True
装饰时将生成一个哈希方法@dataclass()
,但您的应用程序可能不保证这一点,因为frozen
禁止对实例进行属性分配。
https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass
添加回答
举报
0/150
提交
取消