【问题标题】:Is it possible to use Pydantic instead of dataclasses in Structured Configs in hydra-core python package?是否可以在 hydra-core python 包的结构化配置中使用 Pydantic 而不是数据类?
【发布时间】:2022-01-09 08:22:38
【问题描述】:

最近我开始使用hydra 来管理我的应用程序中的配置。我使用 Structured Configs 为 .yaml 配置文件创建架构。 Hyda 中的结构化配置使用dataclasses 进行类型检查。但是,我还想对我在结构化配置中指定的某些参数使用某种验证器(类似于 this)。

您知道是否有可能为此目的使用 Pydantic?当我尝试使用 Pydantic 时,OmegaConf 抱怨它:

omegaconf.errors.ValidationError: Input class 'SomeClass' is not a structured config. did you forget to decorate it as a dataclass?

【问题讨论】:

标签: fb-hydra hydra-python hydra-core


【解决方案1】:

对于那些想知道它是如何工作的人,这里有一个例子:

import hydra
from hydra.core.config_store import ConfigStore
from omegaconf import OmegaConf
from pydantic.dataclasses import dataclass
from pydantic import validator


@dataclass
class MyConfigSchema:
    some_var: float

    @validator("some_var")
    def validate_some_var(cls, some_var: float) -> float:
        if some_var < 0:
            raise ValueError(f"'some_var' can't be less than 0, got: {some_var}")
        return some_var


cs = ConfigStore.instance()
cs.store(name="config_schema", node=MyConfigSchema)


@hydra.main(config_path="/path/to/configs", config_name="config")
def my_app(config: MyConfigSchema) -> None:
    # The 'validator' methods will be called when you run the line below
    OmegaConf.to_object(config)


if __name__ == "__main__":    
    my_app()

还有config.yaml

defaults:
  - config_schema

some_var: -1  # this will raise a ValueError

【讨论】:

  • 不错,看起来不错!
  • Kıvanç,您是否能够让它与 custom- 或 constrained 类型一起使用?我得到验证错误。我更喜欢使用此类类型而不是 @validators。
  • 这似乎对我不起作用。当您调用OmegaConf.to_object() 时,它会将对象转换为dict 而不是MyConfigSchema。因此,MyConfigSchema 永远不会被构造,验证器永远不会运行。
  • @Antyos 你确定你正在使用你在.yaml 文件中注册的结构化配置(在defaults 键中)?
  • @Antyos 很高兴它现在可以工作了! :) 我已经根据您的建议编辑了我的答案。
【解决方案2】:

请参阅 pydantic.dataclasses.dataclass,它是标准库数据类的直接替代品,带有一些额外的类型检查。

【讨论】:

  • 这不能直接工作,但与OmegaConf.to_object(config)一起使用它可以工作。谢谢!
  • 嘿@KıvançYüksel 你能举个例子说明你是如何使用它的吗?
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2012-02-20
相关资源
最近更新 更多