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
)时,会发生所述行为。
如果从数据类导入数据类,则一切都将按预期工作(将调用默认工厂
,以生成字段的值)