如何使用Pydantic基于dict类型数据动态创建模型
解决方案
你可以直接遍历加载得到的字典条目,自动拼接create_model需要的入参格式,不需要手动逐个传入字段配置。
基础实现(适配非嵌套的yaml结构)
import yaml from pydantic import create_model # 第一步:加载yaml文件得到字典 with open("你的配置文件路径.yml", "r", encoding="utf-8") as f: config_dict = yaml.safe_load(f) # 第二步:自动生成字段定义,格式为 {字段名: (字段类型, 默认值)} field_defs = {key: (type(value), value) for key, value in config_dict.items()} # 第三步:直接创建pydantic模型 Test = create_model("Test", **field_defs)
以你给出的示例配置为例,上述代码生成的Test类和手动定义的完全一致:
# 测试效果 t = Test() print(t.key1) # 输出 test print(type(t.key1)) # 输出 <class 'str'> print(t.key2) # 输出 100 print(type(t.key2)) # 输出 <class 'int'>
进阶实现(适配嵌套yaml结构)
如果你的yaml存在嵌套字典的情况,可以用递归函数自动生成嵌套的子模型:
import yaml from pydantic import create_model def dict_to_pydantic_model(model_name: str, data: dict): field_defs = {} for k, v in data.items(): if isinstance(v, dict): # 嵌套字典递归生成子模型 sub_model = dict_to_pydantic_model(f"{model_name}_{k}_sub", v) field_defs[k] = (sub_model, sub_model()) else: field_defs[k] = (type(v), v) return create_model(model_name, **field_defs) # 调用示例 with open("你的配置文件路径.yml", "r", encoding="utf-8") as f: config_dict = yaml.safe_load(f) Test = dict_to_pydantic_model("Test", config_dict)
内容的提问来源于stack exchange,提问作者shelper
相关产品推荐
相关产品推荐

