gmo*_*lau 5 python python-dataclasses
我有一个带有可变字段(列表)的数据类。我希望实现的是,即使在 __init__ 调用中显式设置为 None ,该字段也永远不会为 None 。在普通的类中,实现起来很简单:
class A:
def __init__(self, l: Optional[List[int]] = None):
if l is None:
l = []
self.l = l
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以仅使用dataclasses.field函数来实现相同的结果,即无需显式实现 __init__ 方法(当类有很多属性时,这会很麻烦)?default_factory当提供的 init 参数为 None 时,我可以强制 dataclasses.field 调用它吗?
我不认为可以直接强制在显式提供的 None 值上调用 default_factory 。但是您可以使用该__post_init__方法显式检查 None 并提供 default_value ,特别是当您必须检查许多属性时。
您可以使用该fields函数自动扫描数据类的None值,并为这些属性调用 default_factory(如果提供了):
from dataclasses import dataclass, field, fields, MISSING
from typing import List
@dataclass
class A:
l: List[int] = field(default_factory=list)
def __post_init__(self):
for f in fields(self):
value = getattr(self, f.name)
if value is None and not f.default_factory is MISSING:
setattr(self, f.name, f.default_factory())
s = A([1,2])
print(s.l) # [1,2]
t = A(None)
print(t.l) # []
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2895 次 |
| 最近记录: |