Python 3.x 未对数据类调用默认工厂';领域

Python 3.x 未对数据类调用默认工厂';领域,python-3.x,python-dataclasses,Python 3.x,Python Dataclasses,以下是发生的情况的示例: @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 0x1

以下是发生的情况的示例:

 @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))
@dataclass
D类:
prop1:str
prop2:dict=字段(默认值\工厂=lambda:defaultdict(设置))
d=d(“垃圾邮件”)
印刷品(d)
#D(prop1='spam',prop2=字段(name=None,type=None,default=,default\u factory=,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),\u Field\u type=None))

如您所见,
prop2
不是使用
default\u工厂的默认值初始化的,它仍然是一个字段。如果我尝试执行
d.prop2[“some key”]
我会得到
TypeError:“Field”对象不可下标

您可能从错误的模块导入了
数据类
装饰器。如果在IDE中使用自动导入,可能会发生这种情况

当您从
attr
导入
dataclass
从attr导入dataclass
)时,会发生所述行为。 如果从数据类导入数据类,则一切都将按预期工作(将调用
默认工厂
,以生成字段的值)