用于递归模型实例化的 Pydantic 私有参数
Pydantic private argument for recursive model instantiation
我有一个 Pydantic 模型,它基本上是其他模型的列表,如下所示:
class Thing(BaseModel):
_api: Api = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: API = PrivateAttr()
__root__ = List[Thing]
这些东西是从我对外部 API 进行的 API 调用的 JSON 内容中解析出来的,例如:
def some_method_somewhere(self, api, **other_args)
...
response = await api.send('GET', url)
return ThingList(__root__=response, api=api)
但是,我不知道如何让 Thing
模型的 Pydantic 实例化接收 api
参数。
我能看到的唯一简单的方法是拥有一些函数 return 一个我可以从 PrivateAttr(default_factory=func)
调用的全局值,但那有味道。
此功能应尽可能通用。目前,ThingList 可以通过遍历 Response 对象被普通列表替换(随意假装它来自请求),但不能保证将来是这样。 (事实上 ,其他属性可能来自 API 可能需要集成到 ThingList 中)。
我梦想的解决方案是在 ThingList class 中的某处扩展一个方法,但我找不到 Pydantic 是如何做到的。
您可以在 __init__
封闭模型的方法中更新嵌套对象的私有属性:
class Thing(BaseModel):
_api: str = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: str = PrivateAttr()
__root__: List[Thing]
def __init__(self, *, api, **data):
super().__init__(**data)
self._api = api
for item in self.__root__:
item._api = api
我有一个 Pydantic 模型,它基本上是其他模型的列表,如下所示:
class Thing(BaseModel):
_api: Api = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: API = PrivateAttr()
__root__ = List[Thing]
这些东西是从我对外部 API 进行的 API 调用的 JSON 内容中解析出来的,例如:
def some_method_somewhere(self, api, **other_args)
...
response = await api.send('GET', url)
return ThingList(__root__=response, api=api)
但是,我不知道如何让 Thing
模型的 Pydantic 实例化接收 api
参数。
我能看到的唯一简单的方法是拥有一些函数 return 一个我可以从 PrivateAttr(default_factory=func)
调用的全局值,但那有味道。
此功能应尽可能通用。目前,ThingList 可以通过遍历 Response 对象被普通列表替换(随意假装它来自请求),但不能保证将来是这样。 (事实上 ,其他属性可能来自 API 可能需要集成到 ThingList 中)。
我梦想的解决方案是在 ThingList class 中的某处扩展一个方法,但我找不到 Pydantic 是如何做到的。
您可以在 __init__
封闭模型的方法中更新嵌套对象的私有属性:
class Thing(BaseModel):
_api: str = PrivateAttr()
id: int
name: str
class ThingList(BaseModel):
_api: str = PrivateAttr()
__root__: List[Thing]
def __init__(self, *, api, **data):
super().__init__(**data)
self._api = api
for item in self.__root__:
item._api = api