我需要一个将接受多个参数的类,我知道将提供所有参数,但有些参数可能作为 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')
但是,我觉得它很丑陋,我可能在这里遗漏了一些东西。我的实际班级将有更多的领域,所以它只会变得更丑陋。
传递给类的参数包含 None
我无法控制这方面。
原文由 YeO 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道这有点晚了,但受 MikeSchneeberger 的回答启发,我对
__post_init__
函数做了一个小改动,允许您将默认值保留为标准格式:然后将其添加到您的数据类应确保强制执行默认值而不需要新的默认类。