如何使未冻结的数据类实例可哈希化?

时间:2019-04-17 20:47:38

标签: python python-dataclasses

使用frozen=False(默认行为)定义数据类,然后实例化此类的对象时,是否有办法使该对象可哈希化?

我为什么需要这个?

在python 3.7之前,我使用命名元组而不是数据类,并且我曾经使用set()查找重复项,但是我不能再使用它了。 由于其他原因,我不想在数据类上使用frozen=True

1 个答案:

答案 0 :(得分:2)

有一个参数:

@dataclass(unsafe_hash=True)
class Whatever:
    ...

不过,您可能应该使用frozen=True。如果需要更新冻结的数据类实例上的属性,则可以使用dataclasses.replace来构造一个新对象:

new_thing = dataclasses.replace(old_thing, var=new_val)

当您需要可哈希的内容时,还可以使用可变数据类实例和dataclasses.astuple获取元组。不过请注意-astuple有一堆怪异的复制行为,因此您可以得到如下行为:

In [1]: import dataclasses

In [2]: @dataclasses.dataclass
   ...: class Foo:
   ...:     a: object
   ...:     b: object
   ...:     

In [3]: x = object()

In [4]: a = Foo(x, x)

In [5]: b = dataclasses.astuple(a)

In [6]: b[0] is b[1]
Out[6]: False

In [7]: b[0] is x
Out[7]: False

In [8]: a == a
Out[8]: True

In [9]: dataclasses.astuple(a) == dataclasses.astuple(a)
Out[9]: False
相关问题