Search code examples
fb-hydrahydra-core

Is it possible to use Pydantic instead of dataclasses in Structured Configs in hydra-core python package?


Recently I have started to use hydra to manage the configs in my application. I use Structured Configs to create schema for .yaml config files. Structured Configs in Hyda uses dataclasses for type checking. However, I also want to use some kind of validators for some of the parameter I specify in my Structured Configs (something like this).

Do you know if it is somehow possible to use Pydantic for this purpose? When I try to use Pydantic, OmegaConf complains about it:

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

Solution

  • For those of you wondering how this works exactly, here is an example of it:

    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()
    

    And config.yaml :

    defaults:
      - config_schema
    
    some_var: -1  # this will raise a ValueError