[英]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.