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
来生成字段的值)。
下面是一个例子:
@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
来生成字段的值)。