无法在数据类中创建 DefaultDict

Trouble creating DefaultDict in Dataclass

我在使用新的 defaultdict(dict) 设置简单数据类时遇到问题。

如果我告诉工厂使用 'dict' 如下所示,实例化失败并显示 typerror collection.defaultdict object is not callable

from collections import defaultdict
from dataclasses import dataclass, field

@dataclass
class ResultSet:
    changed: bool = False
    mqttdata:  defaultdict(dict) = field(default_factory=defaultdict(dict)) # does not work!

它确实使用 field(default_factory=defaultdict) 进行了一些工作,但是当我的代码遇到丢失的键时稍后会失败 - 大概是因为没有设置 defaultdict对于字典。

如何在数据类中正确设置新的 defaultdict(dict)?

您的代码以及您目前使用 dataclasses 的方式存在一些问题:

  • 注解中的类型泛型一般需要通过方括号[]指定,所以default[dict]而不是defaultdict(dict)例如

  • dataclasses.field()default_factory 参数需要是一个 no-arg 可调用对象,returns 一个设置了默认值的新对象。例如,假设您有一个嵌套数据类 Inner,它指定所有字段的默认值,您 可以 使用 default_factory=Inner 为每个字段创建一个新的 Inner 对象实例化主数据类的时间。

    注意default_factory参数主要对可变类型有用 例如 setlistdict,这样同一个对象就不会 在数据类实例之间共享(并可能发生变异)。


将它们放在一起,这里是为 defaultdict[dict] 类型的字段设置默认值的工作代码:

from collections import defaultdict
from dataclasses import dataclass, field


@dataclass
class ResultSet:
    changed: bool = False
    mqttdata: defaultdict[dict] = field(default_factory=lambda: defaultdict(dict))  # works!


print(ResultSet())

在 3.9 之前的 Python 版本中,即引入 PEP 585 时,您需要在顶部添加以下导入,以便任何类型注释都是 lazy-evaluated:

from __future__ import annotations