1.背景
如何在化脓性药物中验证特定的类?
我使用化脓性来验证由九头蛇解析的yaml列表参数,稍后将传递给建模例程。问题是,hydra字典包含的不是一个值列表,而是一个包含这些值的类。如何验证这些参数?
2.实例
在下面的示例中,有两个文件:
cfg.yamlmain.py包含要加载和验证cfg.yaml的指令2.1 Config文件cfg.yaml
params_list:
- 10
- 0
- 202.2解析器/验证器文件main.py
import hydra
import pydantic
from omegaconf import DictConfig, OmegaConf
from typing import List
class Test(pydantic.BaseModel):
params_list: List[int]
@hydra.main(config_path=".", config_name="cfg.yaml")
def go(cfg: DictConfig):
parsed_cfg = Test(**cfg)
print(parsed_cfg)
if __name__ == "__main__":
go()3.问题
执行python3 main.py时,会出现以下错误
值不是有效列表(type=type_error.list)。
这是因为hydra有一个特殊的类来处理列表,称为omegaconf.listconfig.ListConfig,可以通过添加
print(type(cfg['params_list']))就在go()函数定义之后。
4.指导
我知道我可能必须告诉pydantic来验证这个特定的事情,但我只是不知道具体的方法。
params_list: Generic)创建一个泛型类型,然后使用验证器装饰器将其转换为一个列表,如下所示:class ParamsList(pydantic.BaseModel):
params_list: ???????? #i don't know that to do here
@p.validator("params_list")
@classmethod
def validate_path(cls, v) -> None:
"""validate if it's a list"""
if type(list(v)) != list:
raise TypeError("It's not a list. Make it become a list")
return list(v)帮助!:知道如何解决吗?
如何重新创建示例
requirements.txt和hydra-core创建了一个hydra-core文件python3 main.py发布于 2022-11-02 14:29:18
Pydantic不接受DictConfig格式。当您尝试用pydantic模型来解析hydra配置时,必须首先将DictConfig转换为本地Python。你用OmegaConf.to_object(cfg)来做这件事。
我假设您使用Python3.10或更高版本。请注意使用version_base="1.2"获取最新的hydra版本。
这应该是可行的:
import hydra
import pydantic
from omegaconf import DictConfig, OmegaConf
class Test(pydantic.BaseModel):
params_list: list[int]
@hydra.main(config_path=".", config_name="cfg.yaml", version_base="1.2")
def go(cfg: DictConfig):
print(cfg)
d_cfg = OmegaConf.to_object(cfg)
parsed_cfg = Test(**d_cfg)
print(parsed_cfg)
if __name__ == "__main__":
go()https://stackoverflow.com/questions/72105603
复制相似问题