簡體   English   中英

如何從 json 中解析帶有“Type”類型字段的 pydantic 模型?

[英]How to parse a pydantic model with a field of type "Type" from json?

如何使用 pydantic 進行以下工作?

from typing import Type

import pydantic


class InputField(pydantic.BaseModel):
    name: str
    type: Type

InputField.parse_raw('{"name": "myfancyfield", "type": "str"}')

它失敗了

pydantic.error_wrappers.ValidationError: 1 validation error for InputField
type
  a class is expected (type=type_error.class)

但是我需要從 json 中解析它,所以我沒有直接將 Type 對象傳遞給__init__方法的選項。

帶有pre=True的自定義驗證器將允許您嘗試查找具有提供的名稱的類。 這是一個工作示例,首先嘗試獲取一個內置的並失敗,假設該類位於全局命名空間中:

from pydantic import BaseModel, validator


class InputField(BaseModel):
    name: str
    type_: type

    @validator("type_", pre=True)
    def parse_cls(cls, value: object) -> type:
        name = str(value)
        try:
            obj = getattr(__builtins__, name)
        except AttributeError:
            try:
                obj = globals()[name]
            except KeyError:
                raise ValueError(f"{value} is not a valid name")
        if not isinstance(obj, type):
            raise TypeError(f"{value} is not a class")
        return obj


class Foo:
    pass


if __name__ == "__main__":
    print(InputField.parse_raw('{"name": "a", "type_": "str"}'))
    print(InputField.parse_raw('{"name": "b", "type_": "Foo"}'))

輸出:

name='a' type_=<class 'str'>
name='b' type_=<class '__main__.Foo'>

如果你也想支持動態導入,那也是可能的。 請參閱此處此處以獲取指示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM