我正在尝试为一些计算科学代码组合数据类、属性和 lru_caches:
from dataclasses import dataclass
from typing import Any
from functools import lru_cache
@dataclass
class 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.c
f=F()
print(f.d)
print(f.d)
我希望看到
Computing d
27
27
但得到
TypeError: unhashable type: 'F'
有没有办法来解决这个问题?
最佳答案
lru_cache
就像记忆化,所以它散列传递给函数的参数并存储结果。你的类不可哈希。为了使它可散列,添加这样的东西
class F:
....
def __hash__(self):
return hash((self.a, self.b, self.c))
这样做的原因是这 3 个属性使每个实例“独一无二”——我们不需要散列方法,因为所有实例都具有相同的方法。
在大多数普通类(class)中,它是
__dict__
用于一般散列,除非 __hash__
方法找到了。数据类文档解释说,数据类可以生成散列方法,但这取决于您如何设置数据类,因为默认情况下假定对象是可变的(并且像列表这样的可变对象不能被散列)。数据类文档指出,如果参数
eq
将生成散列方法。和 frozen
设置为 True
装修时@dataclass()
,但您的应用程序可能不保证此为 frozen
禁止在实例上分配属性。https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass
关于python - 如何组合数据类、属性和 lru_cache,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57355180/