gpt4 book ai didi

python - 如何组合数据类、属性和 lru_cache

转载 作者:行者123 更新时间:2023-12-04 12:39:47 25 4
gpt4 key购买 nike

我正在尝试为一些计算科学代码组合数据类、属性和 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com