【发布时间】:2022-11-02 22:29:18
【问题描述】:
1. 背景
如何验证 pydantic 中的特定类?
我正在使用pydantic 来验证由hydra 解析的yaml 列表参数,以便稍后传递给建模例程。问题是 hydra 字典不包含值列表,而是包含这些值的类。如何验证这些参数?
2. 例子
在以下示例中,有 2 个文件:
-
cfg.yaml包含要验证的参数 -
main.py包含加载和验证cfg.yaml的指令
2.1 配置文件cfg.yaml
params_list:
- 10
- 0
- 20
2.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来验证这个特定的东西,但我只是不知道具体如何。
- Here 提供了一些提示,但对于我猜的任务来说似乎很重要。
- 另一个想法是为数据属性创建一个泛型类型(如
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)帮助!:关于如何解决它的任何想法?
如何重新创建示例
- 在文件夹中添加第 2.1 和 2.2 节中描述的文件。
- 还使用包
pydantic和hydra-core创建一个requirements.txt文件- 创建并激活环境后,运行
python3 main.py
【问题讨论】:
-
在将数据传递给
Test类之前,您是否考虑在DictConfig对象上调用OmegaConf.to_container?例如:parsed_cfg = Test(**OmegaConf.to_container(cfg))。
标签: python validation pydantic fb-hydra