假设我在python3中有一个数据类。我希望能够对这些对象进行散列和排序。我不希望这些是一成不变的
我只想在id上排序/哈希
我在文档中看到,我可以实现散列uu以及所有这些,但我希望让数据处理程序为我完成这项工作,因为它们旨在处理这一问题
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)
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'
TL;DR
将
frozen=True
与eq=True
结合使用(这将使实例不可变)长答案
从docs开始:
从the docs:
由于您设置了
eq=True
并将frozen
保留为默认值(False
),因此您的数据类是不可损坏的您有3种选择:
frozen=True
(除了eq=True
),这将使您的类不可变和可散列李>Set
unsafe_hash=True
,这将创建一个__hash__
方法,但使您的类保持可变状态,因此,如果在dict或Set中存储时修改了类的实例,则可能会出现问题:__hash__
方法李>我想添加一个关于使用不安全散列的特别说明
通过设置compare=False或hash=False,可以排除通过哈希进行比较的字段。(默认情况下,哈希继承自比较)
如果您将节点存储在图形中,但希望在不中断散列的情况下标记已访问的节点(例如,如果它们位于未访问的节点集合中…),则这可能非常有用
这花了我几个小时才弄明白。。。我找到的有用的进一步阅读资料是关于数据类的python文档。具体请参见字段文档和dataclass arg文档。 https://docs.python.org/3/library/dataclasses.html
相关问题 更多 >
编程相关推荐