[英]How to combine dataclass, property, and lru_cache
我正在尝试将数据类,属性和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
就像lru_cache
一样,因此它哈希传递给函数的参数并存储结果。 您的课程不可散列。 为了使其可散列,请添加如下内容
class F:
....
def __hash__(self):
return hash((self.a, self.b, self.c))
原因是这3个属性使每个实例“唯一”-我们无需对方法进行哈希处理,因为所有实例都具有相同的方法。
在大多数普通类上,除非找到__hash__
方法,否则它使用__dict__
进行常规哈希处理。 数据类文档解释说,数据类可能会生成哈希方法,但是这取决于您如何设置数据类,因为默认情况下该对象被认为是可变的(并且可变对象(如列表)不能被哈希)。
数据类文档指出哈希方法,如果参数生成的eq
和frozen
设置为True
与装修时@dataclass()
但您的应用程序可能无法保证这是frozen
禁止在实例属性分配。
https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.