错误:无法损坏类型:@dataclass的“dict”

2024-06-01 02:51:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张课桌:

@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'}

TypeError: unhashable type: 'dict'

我不明白出了什么问题


Tags: nametruetypetabledictclasseqsignature
1条回答
网友
1楼 · 发布于 2024-06-01 02:51:10

自动生成的哈希方法不安全,因为它尝试对不可损坏的属性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使用不同的值。(可能是为了确保相等的项以相同的方式散列。)您不太可能真的想使用这三个字段来比较两个表,所以您应该确定这一点

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

相关问题 更多 >