1 回答

TA貢獻1797條經驗 獲得超6個贊
自動生成的哈希方法不安全,因為它嘗試對不可哈希的屬性 、和 進行哈希處理。您需要定義自己的方法來忽略這些屬性。一種可能性是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具有一個參數,其默認值為 的值,并且文檔不鼓勵對 使用不同的值。(可能是為了確保相等的項目具有相同的哈希值。您不太可能真的想將這三個字段用于比較兩個表,因此這應該沒問題。hashcomparehash
我會查閱文檔,而不是依靠我相對不知情的摘要。
添加回答
舉報