错误:不可散列的类型:带有@dataclass的'dict'

Pav*_*ich 8 python hashtable python-dataclasses

我有一个班级表:

@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]
Run Code Online (Sandbox Code Playgroud)

并需要创建这样的字典:


table = Table(*args)
{table: 'id'}
Run Code Online (Sandbox Code Playgroud)

类型错误:不可散列的类型:'dict'

不明白有什么问题。

che*_*ner 14

自动生成的哈希方法并不安全,因为它尝试对不可哈希的属性signatureprimary_key和进行哈希处理indexed。您需要定义自己的__hash__方法来忽略这些属性。一种可能性是

def __hash__(self):
    return hash((self.name, self.primary_key))
Run Code Online (Sandbox Code Playgroud)

self.name都是self.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)
Run Code Online (Sandbox Code Playgroud)

field有一个hash参数,其默认值为 的值compare,并且文档不鼓励使用不同的值hash。(可能是为了确保相等的项散列相同。)您不太可能真的想使用这三个字段来比较两个表,所以您这应该没问题。

我会查阅文档,而不是依赖我相对无知的总结。