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

标签 python properties lru python-dataclasses

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

相关文章:

python - uWSGI + Django + Python : no module named uwsgi

PHP 通过数组中的字符串访问嵌套对象属性

swift - 为什么在更改现有值的成员时会运行属性观察器?

algorithm - LRU 算法什么时候会 miss 100%?

python - 如何省略列表中的重复项?

python - Cython:为什么 NumPy 数组需要类型转换为对象?

javascript - react 练习 : two arrays rendered by two children and displayed next to each other (Matching indexes) in parent

ios - LRU 缓存的标准实现

Python:构建 LRU 缓存

python - 如何根据其他字段值的条件逻辑设置模型 bool 字段