Python 用pydantic生成动态模型

Python 用pydantic生成动态模型,python,pydantic,Python,Pydantic,我正在尝试使用Python的pydantic库创建一个动态模型。我的输入数据是一个常规的dict。但是,dict(读取:其键)的内容可能会有所不同。 我想知道如何动态创建一个依赖于dict内容的pydantic模型 我用两个不同的dicts(inputs1和inputs2)创建了一个玩具示例。让我们假设称为策略的嵌套dict可能不同。基于strategy/name我提前知道strategy中将存在哪些字段。我需要基于strategy/name创建pydantic模型 from pydantic

我正在尝试使用Python的
pydantic
库创建一个动态模型。我的输入数据是一个常规的
dict
。但是,
dict
(读取:其键)的内容可能会有所不同。
我想知道如何动态创建一个依赖于
dict
内容的
pydantic
模型

我用两个不同的
dict
s(
inputs1
inputs2
)创建了一个玩具示例。让我们假设称为
策略的嵌套
dict
可能不同。基于
strategy/name
我提前知道
strategy
中将存在哪些字段。我需要基于
strategy/name
创建
pydantic
模型

from pydantic import BaseModel

inputs1 = {
    "universe": {"name": "test_universe", "ccy": "USD"},
    "price_src": "csv",
    "strategy": {"name": "test_strat1"},
}
inputs2 = {
    "universe": {"name": "test_universe", "ccy": "USD"},
    "price_src": "csv",
    "strategy": {"name": "test_strat2", "periods": 10},
}


class Universe(BaseModel):
    name: str
    ccy: str = "EUR"


strategy_name = "test_strat2"

if strategy_name == "test_strat1":
    inputs = inputs1

    class Strategy(BaseModel):
        name: str


elif strategy_name == "test_strat2":
    inputs = inputs2

    class Strategy(BaseModel):
        name: str
        periods: int


class StaticModel(BaseModel):
    universe: Universe
    price_src: str = "csv"
    strategy: Strategy


static_model = StaticModel(**inputs)
如果``strategy\u name==“test\u strat1”,我的预期输出:

如果``strategy\u name==“test\u strat2”,则我的预期输出:


我正在考虑使用
pydantic
create\u model
函数。但是,我不知道如何动态定义
字段

对于动态创建pydantic模型,您可以使用。像这样:

from pydantic import create_model

d = {"strategy": {"name": "test_strat2", "periods": 10}}

Strategy = create_model("Strategy", **d["strategy"])

print(Strategy.schema_json(indent=2))
输出:

{
  "title": "Strategy",
  "type": "object",
  "properties": {
    "name": {
      "title": "Name",
      "default": "test_strat2",
      "type": "string"
    },
    "periods": {
      "title": "Periods",
      "default": 10,
      "type": "integer"
    }
  }
}


您是否介意就1)如何定义没有默认值的
str
int
展开您的解决方案?2)以嵌套的方式匹配我的预期解决方案。Ad 1)
strategy=create_model(“strategy”,**d)
应该为您提供嵌套结构,不是吗?我认为不可能创建嵌套模型,但您可以进行实验。至于删除默认值,您可以尝试通过文档中指定的元组使用语法,如
Strategy=create_model(“Strategy”,**{k:(type(v),…)表示k,v在d[“Strategy”].items()})
from pydantic import create_model

d = {"strategy": {"name": "test_strat2", "periods": 10}}

Strategy = create_model("Strategy", **d["strategy"])

print(Strategy.schema_json(indent=2))
{
  "title": "Strategy",
  "type": "object",
  "properties": {
    "name": {
      "title": "Name",
      "default": "test_strat2",
      "type": "string"
    },
    "periods": {
      "title": "Periods",
      "default": 10,
      "type": "integer"
    }
  }
}