我正在嘗試為一些計算科學代碼結合數據類、屬性和 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__
找到方法。數據類文檔解釋說數據類可以生成散列方法,但這取決于您如何設置數據類,因為默認情況下假定對象是可變的(并且不能對列表等可變對象進行散列)。
數據類文檔指出,如果參數eq
和frozen
設置為True
裝飾時將生成一個哈希方法@dataclass()
,但您的應用程序可能不保證這一點,因為frozen
禁止對實例進行屬性分配。
https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass
添加回答
舉報
0/150
提交
取消