python - 用pydantic指定嵌套字典的最佳方法?
问题描述
语境
我正在尝试使用pydantic
.
我想指定 dict 可以有一个 key daytime
,或者没有。如果是这样,我希望 的值daytime
同时包含sunrise
和sunset
。
例如,这些应该被允许:
{
'type': 'solar',
'daytime': {
'sunrise': 4, # 4am
'sunset': 18 # 6pm
}
}
和
{
'type': 'wind'
# daytime key is omitted
}
和
{
'type': 'wind',
'daytime': None
}
但我想验证失败
{
'type': 'solar',
'daytime': {
'sunrise': 4
}
}
因为这有daytime
值,但没有日落值。
MWE
我有一些代码可以做到这一点。如果我运行此脚本,它将成功执行。
from pydantic import BaseModel, ValidationError
from typing import List, Optional, Dict
class DayTime(BaseModel):
sunrise: int
sunset: int
class Plant(BaseModel):
daytime: Optional[DayTime] = None
type: str
p = Plant.parse_obj({'type': 'wind'})
p = Plant.parse_obj({'type': 'wind', 'daytime': None})
p = Plant.parse_obj({
'type': 'solar',
'daytime': {
'sunrise': 5,
'sunset': 18
}})
try:
p = Plant.parse_obj({
'type': 'solar',
'daytime': {
'sunrise': 5
}})
except ValidationError:
pass
else:
raise AssertionError("Should have failed")
问题
我想知道的是, 这就是你应该如何使用 pydantic 来处理嵌套数据吗?
我有很多嵌套层,这似乎有点冗长。
有没有办法做一些更简洁的事情,比如:
class Plant(BaseModel):
daytime: Optional[Dict[('sunrise', 'sunset'), int]] = None
type: str
解决方案
Pydanticcreate_model
函数正是您所需要的:
from pydantic import BaseModel, create_model
class Plant(BaseModel):
daytime: Optional[create_model('DayTime', sunrise=(int, ...), sunset=(int, ...))] = None
type: str
推荐阅读
- node.js - 如何在亚马逊 EC2 实例上启动我的 NestJs 应用程序
- swift - 你如何实现十进制键盘?
- excel - SaveAs Pictures on excel 维护他们的分辨率
- laravel - 如何在 laragon 中运行 laravel websockets?
- java - 打印对称的二维数组
- ios - 无法准备 XYZ 的 iPhone 进行开发
- python - Jupyter Notebook 命令提示导入错误
- validation - 如何将 pkg 服务/数据库连接集成到 util pkg 验证器?
- java - 以对象为参数导出到 CSV
- javascript - 错误:当我将 odoo 端点与 Php 或 Javascript 一起使用时,会话已过期