为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3146593 2022-04-23 17:12:27
我正在尝试为一些计算科学代码结合数据类、属性和 lru_caches:from dataclasses import dataclassfrom typing import Anyfrom functools import lru_cache@dataclassclass 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.cf=F()print(f.d)print(f.d)我希望看到Computing d2727但得到TypeError: unhashable type: 'F'有没有办法解决这个问题?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

lru_cache就像记忆一样,它对传递给函数的参数进行哈希处理并存储结果。您的课程不可散列。要使其可散列,请添加类似这样的内容

class F:
    ....
    def __hash__(self):
            return hash((self.a, self.b, self.c))

这样做的原因是这 3 个属性使每个实例“唯一”——我们不需要对方法进行散列,因为所有实例都具有相同的方法。

在大多数普通类上,它__dict__用于一般散列,除非__hash__找到方法。数据类文档解释说数据类可以生成散列方法,但这取决于您如何设置数据类,因为默认情况下假定对象是可变的(并且不能对列表等可变对象进行散列)。

数据类文档指出,如果参数eqfrozen设置为True装饰时将生成一个哈希方法@dataclass(),但您的应用程序可能不保证这一点,因为frozen禁止对实例进行属性分配。

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


查看完整回答
反对 回复 2022-04-23
  • 1 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号