Python数据类生成哈希并排除不安全字段

2023-11-24

我有这个数据类:

from dataclasses import dataclass, field
from typing import List

@dataclass
class Person:
    name: str
    dob: str
    friends: List['Person'] = field(default_factory=list, init=False)

name and dob是不可变的并且friends是可变的。我想生成每个人对象的哈希值。我可以以某种方式指定要包含和排除哪个字段来生成__hash__方法?在这种情况下,name and dob应包含在生成哈希值中并且friends不应该。这是我的尝试,但没有成功

@dataclass
class Person:
    name: str = field(hash=True)
    dob: str = field(hash=True)
    friends: List['Person'] = field(default_factory=list, init=False, hash=False)
>>> hash(Person("Mike", "01/01/1900"))
Traceback (most recent call last):
  File "<pyshell#43>", line 1, in <module>
    hash(Person("Mike", "01/01/1900"))
TypeError: unhashable type: 'Person'

我也找不到设置方法name and dob被冻结。我会避免设置unsafe_hash to True,仅从声音来看。有什么建议么?

另外,我正在做的事情被认为是好的做法吗?如果没有,你能建议一些替代方案吗?

谢谢

编辑:这只是一个玩具示例,我们可以假设 name 和 dob 字段是唯一的。

编辑:我举了一个例子来演示该错误。


只需表明friends与实例进行比较时不应考虑字段__eq__,并通过hash=True到所需字段上的字段实例。

然后,通过unsafe_hash=True论证dataclass装饰器本身 - 它将按照您的预期工作(大多数情况下):

对于哈希,语言限制是如果一个实例与另一个实例比较相等(__eq__),两者的哈希值也必须相等。这种情况的含义是,如果您有两个具有相同“姓名”和“出生日期”字段的“同一”人实例,即使它们具有不同的好友列表,它们也会被视为相等。

除此之外,这应该有效:


from dataclasses import dataclass, field
from typing import List

@dataclass(unsafe_hash=True)
class Person:
    name: str = field(hash=True)
    dob: str = field(hash=True)
    friends: List['Person'] = field(default_factory=list, init=False, compare=False, hash=False)

然后,记得表现得像一个“同意的成年人”,not在任何地方更改 Person 实例的“name”和“dob”字段,就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python数据类生成哈希并排除不安全字段 的相关文章

随机推荐