如何使数据类哈希与字符串相同?

Tom*_*ean 0 python hash dictionary python-dataclasses

我想用 a 替换代码中字典中的字符串键,dataclass以便我可以为键提供元数据以进行调试。但是,我仍然希望能够使用字符串来查找字典。我尝试使用替换函数实现数据类__hash__,但是我的代码未按预期工作:

from dataclasses import dataclass

@dataclass(eq=True, frozen=True)
class Key:
    name: str

    def __hash__(self):
        return hash(self.name)

k = "foo"
foo = Key(name=k)

d = {}
d[foo] = 1

print(d[k])  # Key Error
Run Code Online (Sandbox Code Playgroud)

这两个哈希函数是相同的:

print(hash(k) == hash(foo))  # True
Run Code Online (Sandbox Code Playgroud)

所以我不明白为什么这不起作用。

Sam*_*ord 5

具有不同哈希值的两个对象保证它们是不同的,但是具有相同哈希值的两个对象本身并不能保证它们是相同的(因为存在哈希冲突)。如果您希望Key被视为等于相应的str,请在 中实现__eq__

    def __eq__(self, other):
        if isinstance(other, Key):
            return self.name == other.name
        if isinstance(other, str):
            return self.name == other
        return False
Run Code Online (Sandbox Code Playgroud)

这解决了KeyError您遇到的问题。