首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pydantic验证类(水核心列表)

使用pydantic验证类(水核心列表)
EN

Stack Overflow用户
提问于 2022-05-03 21:22:55
回答 1查看 295关注 0票数 0

1.背景

如何在化脓性药物中验证特定的类?

我使用化脓性来验证由九头蛇解析的yaml列表参数,稍后将传递给建模例程。问题是,hydra字典包含的不是一个值列表,而是一个包含这些值的类。如何验证这些参数?

2.实例

在下面的示例中,有两个文件:

  • 包含待验证参数的cfg.yaml
  • main.py包含要加载和验证cfg.yaml的指令

2.1 Config文件cfg.yaml

代码语言:javascript
复制
params_list:
  - 10
  - 0
  - 20

2.2解析器/验证器文件main.py

代码语言:javascript
复制
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,可以通过添加

代码语言:javascript
复制
print(type(cfg['params_list']))

就在go()函数定义之后。

4.指导

我知道我可能必须告诉pydantic来验证这个特定的事情,但我只是不知道具体的方法。

  • 这里提供了一些技巧,但我想它似乎对这项任务有很大帮助。
  • 另一个想法是为数据属性(如params_list: Generic)创建一个泛型类型,然后使用验证器装饰器将其转换为一个列表,如下所示:
代码语言:javascript
复制
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)

帮助!:知道如何解决吗?

如何重新创建示例

  1. 在文件夹中添加2.1和2.2节中描述的文件。
  2. 还使用包requirements.txthydra-core创建了一个hydra-core文件
  3. 创建并激活env之后,运行python3 main.py
EN

回答 1

Stack Overflow用户

发布于 2022-11-02 14:29:18

Pydantic不接受DictConfig格式。当您尝试用pydantic模型来解析hydra配置时,必须首先将DictConfig转换为本地Python。你用OmegaConf.to_object(cfg)来做这件事。

我假设您使用Python3.10或更高版本。请注意使用version_base="1.2"获取最新的hydra版本。

这应该是可行的:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72105603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档