传递 None 时如何将默认值应用于 Python 数据类字段?

新手上路,请多包涵

我需要一个将接受多个参数的类,我知道将提供所有参数,但有些参数可能作为 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 许可协议

阅读 878
2 个回答

我知道这有点晚了,但受 MikeSchneeberger 的回答启发,我对 __post_init__ 函数做了一个小改动,允许您将默认值保留为标准格式:

 from dataclasses import dataclass, fields
def __post_init__(self):
    # Loop through the fields
    for field in fields(self):
        # If there is a default and the value of the field is none we can assign a value
        if not isinstance(field.default, dataclasses._MISSING_TYPE) and getattr(self, field.name) is None:
            setattr(self, field.name, field.default)

然后将其添加到您的数据类应确保强制执行默认值而不需要新的默认类。

原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单的解决方案是仅在 __post_init__() 中实现默认参数!

 @dataclass
class Specs2:
    a: str
    b: str
    c: str

    def __post_init__(self):
        if self.b is None:
            self.b = 'Bravo'
        if self.c is None:
            self.c = 'Charlie'

(代码未经测试。如果我有一些细节错误,那不是第一次了)

原文由 Lars P 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题