在 Hydra 或 pydantic 中使用`MISSING`有什么意义?

问题描述 投票:0回答:1

我正在用 python 创建一个配置管理系统,并正在探索 Hydra/pydantic/两者之间的选项。我对何时使用

MISSING
与仅将其留空/可选感到有点困惑。我将在这里使用 OmegaConf 的示例,因为 九头蛇的底层结构使用它。

@dataclass
class User:
    # A simple user class with two missing fields
    name: str = MISSING
    height: Height = MISSING

其中表示此

MISSING
字段将转换为 yaml 的
???
等效项。我可以把它留空吗?

python config pydantic fb-hydra omegaconf
1个回答
0
投票

我们可以想到三种情况,

  1. 不分配任何值 - 该属性不存在,或将其声明为数据类中的非默认值。
    根据您使用的库,您要么需要给出一个值来初始化对象,要么属性/键不存在并且人们不知道它。
  2. 无分配(或某些默认值)-通常是声明默认值的好方法,例如
    Optional[bool]
    但是如果您想要一个具有强制选择的三元参数,其中
    None
    并不意味着默认值(
    bool | None
    ),该怎么办?您将需要一个特殊的第四个值来声明默认或缺失的属性 -> 3.
  3. 分配一个特殊的值/对象,例如 MISSING。
    您声明这与 None 不同并且需要在其他地方设置。它还允许您(部分)初始化对象并通知用户这需要处理。

对我来说,它总结为:当您希望某个值存在时,您想声明它为 MISSING,但您不能为其指定默认值。


关于 omegaconf,您有两个(或三个)案例:

  1. 密钥不存在 -> 属性错误(或者更确切地说是 ConfigAttributeError)
  2. 该值是MISSING,您仍然可以设置该键并询问是否是MISSING。获取属性将导致
    MissingMandatoryValue
  3. 当您使用结构模式时,您无法(轻松)添加或删除键。您需要退回到 2),因为 1) 是不可能的。
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.