为了账号安全,请及时绑定邮箱和手机立即绑定

错误:不可哈希类型:带有@dataclass的“dict”

错误:不可哈希类型:带有@dataclass的“dict”

森林海 2022-08-02 15:49:50
我有一个类表:@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'}类型错误:不可哈希类型:“字典”不明白问题出在哪里。
查看完整描述

1 回答

?
FFIVE

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


我会查阅文档,而不是依靠我相对不知情的摘要。


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号