【问题标题】:dataclass containing initalized set?包含初始化集的数据类?
【发布时间】:2020-05-18 23:51:16
【问题描述】:

我正在尝试将数据类用于某事,并且我需要在其中初始化一个空集,但我无法弄清楚如何去做。在使用数据类(只是普通类)之前,我拥有的等效工作是self.children = set(),这对我的目的来说很好。如何在数据类中获得等价物?

我需要它默认初始化,不必每次都作为参数传递。

from dataclasses import dataclass, field


@dataclass(unsafe_hash=True)
class Node:
    index: int
    name: str
    children: set = field(default_factory=set, hash=True)

尝试将项目添加到集合时遇到错误。添加的项目是 Node 类型(上面的类)。

    root.children.add(child)
  File "<string>", line 2, in __hash__
TypeError: unhashable type: 'set'

【问题讨论】:

  • children: set?
  • 请说明您尝试了什么以及失败的原因。代码中的注释说您尝试了一些东西并没有多大帮助......
  • 对不起,我还应该指定它必须被初始化,不必每次都作为参数传递。添加了我尝试过的东西。

标签: python python-3.x set python-3.7 python-dataclasses


【解决方案1】:

是:

children: set = field(default_factory=set)

默认的factory是一个function,在初始化返回初始值的字段时会被调用。因此,将它传递给set 而不调用它,这是一个在调用时返回一个新集合的函数。您还必须为数据类添加 : set 类型注释,以将其作为字段拾取。

【讨论】:

  • 谢谢。我现在还有一个问题需要解决,收到错误TypeError: unhashable type: 'set',我尝试添加hash=True 选项。是,children: set = field(default_factory=set, hash=True) 当我尝试向集合中添加一些东西时会发生此错误。
  • 你知道什么时候准确吗?
  • 抱歉,在您发布后立即编辑了我的评论。当我尝试将一个项目添加到集合中时,我得到了错误。我要添加的项目是上面的类定义。 children.add(child) # child is of type Node (class above)
  • @Flengo 我假设您正在尝试将另一个 Node 实例添加到集合中?好吧,问题是set 是可变的,因此Node 不能安全地散列。您首先需要定义自己的逻辑,如何对具有可变 childrenNode 进行唯一哈希处理。也许只是通过它的index?然后实现你自己的__hash__ 方法来实现那个逻辑。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2018-03-14
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
相关资源
最近更新 更多