【发布时间】:2020-06-18 07:54:16
【问题描述】:
我有这个数据类:
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 和 dob 是不可变的,friends 是可变的。我想生成每个人对象的哈希。我可以以某种方式指定要包含和排除哪个字段以生成__hash__ 方法吗?在这种情况下,name 和 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 和dob 设置为冻结的方法。而且我会避免将unsafe_hash 设置为True,只是通过它的声音。有什么建议吗?
另外,我正在做的事情被认为是好的做法吗?如果没有,您能提出一些替代方案吗?
谢谢
编辑:这只是一个玩具示例,我们可以假设 name 和 dob 字段是唯一的。
编辑:我举了一个例子来说明错误。
【问题讨论】:
-
听起来这些对象根本不应该是可散列的。
-
好吧,如果你删除朋友,那么他们应该是可散列的,这就是我要问的。如何从哈希中排除朋友?我应该吗?
-
假设我有我的朋友迈克,生于 1972 年 3 月 3 日,我的朋友其他迈克,巧合地也出生于 1972 年 3 月 3 日。说这两个人是平等的?如果不是,这个提议的哈希有什么好处?
-
真的,生成
__eq__或__hash__可能没有意义。您可以将eq=False传递给dataclass装饰器以避免生成任一方法,并让该类从object继承默认的基于身份的__eq__和__hash__。 -
这听起来还是应该从
object继承__hash__和__eq__。