猿问

如何组合数据类、属性和 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'

有没有办法解决这个问题?


慕妹3146593
浏览 140回答 1
1回答

慕森王

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
随时随地看视频慕课网APP

相关分类

Python
我要回答