繁体   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