gpt4 book ai didi

python - 如何使未卡住的数据类实例可散列?

转载 作者:行者123 更新时间:2023-12-04 01:44:49 25 4
gpt4 key购买 nike

使用 frozen=False 定义数据类时(默认行为),然后实例化这个类的一个对象,有没有办法让这个对象可以散列?

为什么我需要这个?

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

最佳答案

有一个参数:

@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

关于python - 如何使未卡住的数据类实例可散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com