gpt4 book ai didi

python-3.x - 传递 None 时如何将默认值应用于 python 数据类字段?

转载 作者:行者123 更新时间:2023-12-03 14:41:35 25 4
gpt4 key购买 nike

编辑:为了清楚起见,我需要一个 class这将接受许多参数,我知道将提供所有参数,但有些可能作为 None 传递在这种情况下,我的 class必须提供默认值。

我想设置一个简单的 dataclass有一些默认值,如下所示:

@dataclass
class Specs1:
a: str
b: str = 'Bravo'
c: str = 'Charlie'

我希望能够获得第二个字段的默认值,但仍然为第三个字段设置一个值。我不能用 None 这样做,因为它被愉快地接受为我的字符串的值:
r1 = Specs1('Apple', None, 'Cherry') # Specs1(a='Apple', b=None, c='Cherry')

我想出了以下解决方案:
@dataclass
class Specs2:
def_b: ClassVar = 'Bravo'
def_c: ClassVar = 'Charlie'
a: str
b: str = def_b
c: str = def_c

def __post_init__(self):
self.b = self.def_b if self.b is None else self.b
self.c = self.def_c if self.c is None else self.c

这似乎符合预期:
r2 = Specs2('Apple', None, 'Cherry') # Specs2(a='Apple', b='Bravo', c='Cherry')

但是,我觉得它很丑陋,而且我可能在这里遗漏了一些东西。我的实际类(class)将有更多字段,因此只会变得更丑。

编辑:我应该补充一点,传递给类的参数包含 None 并且我无法控制这方面。

最佳答案

这是另一种解决方案。

定义 DefaultValNoneRefersDefault类型:

from dataclasses import dataclass, fields

@dataclass
class DefaultVal:
val: Any


@dataclass
class NoneRefersDefault:
def __post_init__(self):
for field in fields(self):

# if a field of this data class defines a default value of type
# `DefaultVal`, then use its value in case the field after
# initialization has either not changed or is None.
if isinstance(field.default, DefaultVal):
field_val = getattr(self, field.name)
if isinstance(field_val, DefaultVal) or field_val is None:
setattr(self, field.name, field.default.val)

用法:
@dataclass
class Specs3(NoneRefersDefault):
a: str
b: str = DefaultVal('Bravo')
c: str = DefaultVal('Charlie')

r3 = Specs3('Apple', None, 'Cherry') # Specs3(a='Apple', b='Bravo', c='Cherry')

编辑 #1:重写 NoneRefersDefault因此,以下也是可能的:
@dataclass
r3 = Specs3('Apple', None) # Specs3(a='Apple', b='Bravo', c='Charlie')

编辑 #2:请注意,如果没有类继承自 Spec ,最好在数据类和“构造函数”函数中没有默认值 create_spec反而:
@dataclass
class Specs4:
a: str
b: str
c: str

def create_spec(
a: str,
b: str = None,
c: str = None,
):
if b is None:
b = 'Bravo'
if c is None:
c = 'Charlie'

return Spec4(a=a, b=b, c=c)

另见 dataclass-abc/example

关于python-3.x - 传递 None 时如何将默认值应用于 python 数据类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56665298/

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