无法在数据类中创建 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
参数主要对可变类型有用
例如 set
、list
和 dict
,这样同一个对象就不会
在数据类实例之间共享(并可能发生变异)。
将它们放在一起,这里是为 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
我在使用新的 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
参数主要对可变类型有用 例如set
、list
和dict
,这样同一个对象就不会 在数据类实例之间共享(并可能发生变异)。
将它们放在一起,这里是为 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