簡體   English   中英

錯誤:不可散列的類型:'dict' with @dataclass

[英]Error: unhashable type: 'dict' with @dataclass

我有一個班級表:

@dataclass(frozen=True, eq=True)
class Table:
    name: str
    signature: Dict[str, Type[DBType]]
    prinmary_key: str
    foreign_keys: Dict[str, Type[ForeignKey]]
    indexed: List[str]

並且需要創建這樣的字典:


table = Table(*args)
{table: 'id'}

類型錯誤:不可散列的類型:'dict'

不明白有什么問題。

自動生成的散列方法並不安全,因為它試圖散列不可散列的屬性signatureprimary_keyindexed 您需要定義自己的__hash__方法來忽略這些屬性。 一種可能性是

def __hash__(self):
    return hash((self.name, self.primary_key))

self.nameself.primary_key都是不可變的,所以包含這些值的元組也是不可變的,因此是可散列的。


顯式定義此方法的另一種方法是使用field函數關閉可變字段以進行哈希處理。

@dataclass(frozen=True, eq=True)
class Table:
    name: str
    signature: Dict[str, Type[DBType]] = field(compare=False)
    prinmary_key: str
    foreign_keys: Dict[str, Type[ForeignKey]] = field(compare=False)
    indexed: List[str] = field(compare=False)

field有一個hash參數,其默認值是compare的值,文檔不鼓勵對hash使用不同的值。 (可能是為了確保相同的項目散列相同。)您不太可能真的想使用這三個字段來比較兩個表,所以您應該可以。

我會查閱文檔,而不是依賴於我相對不知情的總結。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM