首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在pydantic.validators.find_validators TypeError中: issubclass() arg 1必须是一个类

在pydantic.validators.find_validators TypeError中: issubclass() arg 1必须是一个类
EN

Stack Overflow用户
提问于 2022-04-11 08:40:54
回答 1查看 114关注 0票数 0

你好,我正在阅读具有以下格式的JSON:

代码语言:javascript
复制
{
    "1": {"id":1, "type": "a"},
    2: {"id":2, "type": "b"},
    "3": {"id":3, "type": "c"},
    "5": {"id":4, "type": "d"}
}

正如你所看到的,这些键是数字,但不是连续的。

所以我有下面的BaseModel到嵌套的dict

代码语言:javascript
复制
@validate_arguments
class ObjI(BaseModel):
    id: int
    type: str

问题是如何验证dict中的所有项都是ObjI,而无需使用:

代码语言:javascript
复制
objIs = json.load(open(path))
assert type(objIs) == dict
    for objI in objIs.values():
        assert type(objI) == dict
        ObjI(**pair)

我试过:

代码语言:javascript
复制
@validate_arguments
class ObjIs(BaseModel):
    ObjIs:  Dict[Union[str, int], ObjI]

编辑

验证前一项的错误是:

代码语言:javascript
复制
in pydantic.validators.find_validators TypeError: issubclass() arg 1 must be a class

这个是可能的吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-04-11 18:13:18

您可以将模型定义更改为使用https://pydantic-docs.helpmanual.io/usage/models/#custom-root-types (不需要validate_arguments装饰器):

代码语言:javascript
复制
from pydantic import BaseModel
from typing import Dict

class ObjI(BaseModel):
    id: int
    type: str

class ObjIs(BaseModel):
    __root__: dict[int, ObjI]

现在可以使用JSON数据初始化模型,例如:

代码语言:javascript
复制
import json
with open("/path/to/data") as file:
    data = json.load(file)

objis = ObjIs.parse_obj(data)

如果data包含无效类型(或缺少字段),prase_obj()将引发ValidationError。例如,如果data看起来是这样的:

代码语言:javascript
复制
data = {
    "1": {"id": "x", "type": "a"},
#                ^
#                wrong type
    2: {"id": 2, "type": "b"},
    "3": {"id": 3, "type": "c"},
    "4": {"id": 4, "type": "d"},
}

objs = ObjIs.parse_obj(data)

这将导致:

代码语言:javascript
复制
pydantic.error_wrappers.ValidationError: 1 validation error for ObjIs
__root__ -> 1 -> id
  value is not a valid integer (type=type_error.integer)

这告诉我们,具有键id的对象的1类型无效。

(您可以像处理Python中的任何其他异常一样捕获和处理ValidationError。)

( pydantic 文档还建议在模型上实现自定义__iter____getitem__方法,如果您想直接访问__root__字段中的项。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71824924

复制
相关文章

相似问题

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