我有一个数据类,我想使用以下方法对其实例进行哈希和排序id
会员作为钥匙。
from dataclasses import dataclass, field
@dataclass(eq=True, order=True)
class Category:
id: str = field(compare=True)
name: str = field(default="set this in post_init", compare=False)
我知道我可以实施__hash__
我。但是,我希望数据类为我完成这项工作,因为它们旨在处理这个问题。
不幸的是,上面的数据类失败了:
a = sorted(list(set([ Category(id='x'), Category(id='y')])))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Category'
From the docs https://docs.python.org/3/library/dataclasses.html#dataclasses.dataclass:
以下是管理隐式创建的规则__hash__()
method:
[...]
If eq
and frozen
默认情况下都是 truedataclass()
将要
生成一个__hash__()
方法给你。 If eq
是真的并且frozen
是假的,__hash__()
将被设置为None
,将其标记为不可散列
(确实如此,因为它是可变的)。如果eq
是假的,__hash__()
将保持不变意味着__hash__()
的方法
将使用超类(如果超类是对象,这意味着它
将回退到基于 id 的哈希)。
既然你设置了eq=True
离开frozen
在默认情况下(False
),你的数据类是不可散列的。
您有 3 个选择:
- Set
frozen=True
(与默认值结合使用eq=True
),这将使你的类不可变且可散列。@dataclass(frozen=True)
- Set
unsafe_hash=True
,这将创建一个__hash__
方法,但让你的类保持可变。@dataclass(unsafe_hash=True)
如果类的实例在存储在字典或集合中时被修改,则可变性会带来问题:cat = Category('foo', 'bar')
categories = {cat}
cat.id = 'baz'
print(cat in categories) # False
- 手动实施
__hash__
method.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)