繁体   English   中英

如何合并数据类,属性和lru_cache

[英]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__进行常规哈希处理。 数据类文档解释说,数据类可能会生成哈希方法,但是这取决于您如何设置数据类,因为默认情况下该对象被认为是可变的(并且可变对象(如列表)不能被哈希)。

数据类文档指出哈希方法,如果参数生成的eqfrozen设置为True与装修时@dataclass()但您的应用程序可能无法保证这是frozen禁止在实例属性分配。

https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM