Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当提供的参数为None时,是否可以强制dataclass字段调用其默认工厂?_Python_Python Dataclasses - Fatal编程技术网

Python 当提供的参数为None时,是否可以强制dataclass字段调用其默认工厂?

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__方法(当类有很多属性

我有一个带有可变字段(列表)的数据类。我希望实现的是,即使在_init__调用中显式设置为None,该字段也永远不会为None。在普通类中,实现这一点很简单:

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。