gpt4 book ai didi

python - 当提供的参数为 None 时,是否可以强制数据类字段调用其 default_factory?

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:52 25 4
gpt4 key购买 nike

我有一个带有可变字段(列表)的数据类。我希望实现的是这个字段永远不会是 None,即使在 __init__ 调用中明确设置为 None 也是如此。在普通类中,实现起来很简单:

class A:
def __init__(self, l: Optional[List[int]] = None):
if l is None:
l = []
self.l = l

有没有办法只使用 dataclasses.field 来达到相同的结果?函数,即没有显式实现 __init__ 方法(​​当类有很多属性时这会很麻烦)?当提供的 init 参数为 None 时,我可以强制 dataclasses.field 调用它的 default_factory 吗?

最佳答案

我不认为,直接强制 default_factory 在显式提供的 None 值上被调用是不可能的。但是您可以使用 __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) # []

关于python - 当提供的参数为 None 时,是否可以强制数据类字段调用其 default_factory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com