python - 递归模型实例化的 Pydantic 私有参数
问题描述
我有一个 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
参数。
我能看到的唯一简单的方法是让一些函数返回一个我可以从中调用的全局值PrivateAttr(default_factory=func)
,但这有异味。
此功能应尽可能通用。目前 ThingList 可以通过迭代 Response 对象替换为普通列表(随意假装它来自请求),但将来不能保证这是真的。(事实上,其他属性很可能来自需要集成到 ThingList 中的 API)。
我梦想的解决方案是在 ThingList 类的某个地方扩展一个方法,但我找不到 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
推荐阅读
- xpath - 用于 URL 提取的 XPath 查询
- apollo-client - 使用 vue-composition api 从 graphql 服务器接收到数据后转换数据
- python - 使用 Tkinter 使用 MySQL 进行格式化
- graphql - CreateReadStream 不是函数
- python - JSON 中出现随机(不正确)逗号,来自 Flask 的请求非常大
- c# - 如何在控制台应用程序中创建 WPF 窗口?
- pandas - 查找子字符串是否包含在 Pandas 中 Dataframe 的索引中
- docker - 从 docker 容器内部连接到主机网络上的 IP 地址
- swift - 如何使用数组中的字符串索引在 Swift 中使用 UIImage 与文本一起显示?
- javascript - 在 .then() 链中间重试 fetch() 调用