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