Python 当提供的参数为None时,是否可以强制dataclass字段调用其默认工厂?
我有一个带有可变字段(列表)的数据类。我希望实现的是,即使在_init__调用中显式设置为None,该字段也永远不会为None。在普通类中,实现这一点很简单:Python 当提供的参数为None时,是否可以强制dataclass字段调用其默认工厂?,python,python-dataclasses,Python,Python Dataclasses,我有一个带有可变字段(列表)的数据类。我希望实现的是,即使在_init__调用中显式设置为None,该字段也永远不会为None。在普通类中,实现这一点很简单: class A: def __init__(self, l: Optional[List[int]] = None): if l is None: l = [] self.l = l 是否有一种方法可以仅使用函数实现相同的结果,即不显式实现_init__方法(当类有很多属性
class A:
def __init__(self, l: Optional[List[int]] = None):
if l is None:
l = []
self.l = l
是否有一种方法可以仅使用函数实现相同的结果,即不显式实现_init__方法(当类有很多属性时,这会很麻烦)?当提供的init参数为None时,我是否可以强制dataclasses.field调用其
默认工厂
?您可以使用\u post\u init\u
方法实现所需的结果,该方法将self.l
设置为空列表,即使它是None
:
@dataclass
class A:
l: Optional[List[int]]
def __post_init__(self):
self.l = self.l or []
a = A(None)
print(a.l) # []
我不认为可以直接强制在显式provided None值上调用默认的工厂。但是您可以使用
\uuuu post\u init\uuu
方法显式检查None并提供默认值,特别是当您必须检查许多属性时
您可以使用字段
功能自动扫描数据类中的无
值,并为这些属性调用默认工厂(如果提供):
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) # []
您想要以下行为:a=a(无)然后a.l=[]?或者a=a()然后a.l=[]?前者,后者是
默认工厂
的目标。是的,我自己刚刚有了这个想法,目前正在尝试设置一个自动执行此操作的mixin。“自动执行此操作的mixin”-听起来很有趣。为什么,我不应该简单地继承一个uu post_init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我也会小心直接使用MISSING
,文档建议不要这样做。如果可以调用(field.default\u factory),可以简单地执行。
。我忘了在第一个版本中没有检查。我更新了我的答案,以检查无值。我不是舒尔关于丢失的。文件还说,它是一个哨兵值,用于指示是否提供了默认的工厂。由于missing是由定义的数据类或Mixin封装的,因此在本例中可以使用它。callable(field.default_factory)依赖于这样一个事实,即callable(MISSING)=False,但如果未提供默认_factory,则由于field.default_factory is MISSING为true,我不是舒尔,如果它比直接与MISSING@Hatatister我要说的是,这个案例实际上是缺失的一个很好的用例。另请参阅它的价值所在,不必检查缺失
,只需尝试设置并排除类型错误
,也可以实现同样的效果,而且可以说更像python。