default_factory 未在数据类的字段上调用

default_factory not being called on dataclasses' fields

下面是一个例子:

 @dataclass 
 class D: 
     prop1: str 
     prop2: dict = field(default_factory=lambda: defaultdict(set)) 

 d = D("spam")
 print(d)
 # D(prop1='spam', prop2=Field(name=None,type=None,default=<dataclasses._MISSING_TYPE object at 0x10274c650>,default_factory=<function D.<lambda> at 0x103ad3a70>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),_field_type=None))

如您所见,prop2 并未使用 default_factory 中的默认值进行初始化,它仍然是一个字段。如果我尝试做 d.prop2["some key"] 我会得到 TypeError: 'Field' object is not subscriptable.

您可能从错误的模块中导入了 dataclass 装饰器。如果您在 IDE.

中使用自动导入,则可能会发生这种情况

当您从 attr (from attr import dataclass) 导入 dataclass 时,会发生上述行为。 如果你这样做 from dataclasses import dataclass 一切都会按预期工作(将调用 default_factory 来生成字段的值)。