用 pydantic 指定嵌套字典的最佳方法?
Best way to specify nested dict with pydantic?
上下文
我正在尝试 validate/parse 使用 pydantic
的一些数据。
我想指定字典可以有键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
Pydantic create_model
功能正是您所需要的:
from pydantic import BaseModel, create_model
class Plant(BaseModel):
daytime: Optional[create_model('DayTime', sunrise=(int, ...), sunset=(int, ...))] = None
type: str
上下文
我正在尝试 validate/parse 使用 pydantic
的一些数据。
我想指定字典可以有键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
Pydantic create_model
功能正是您所需要的:
from pydantic import BaseModel, create_model
class Plant(BaseModel):
daytime: Optional[create_model('DayTime', sunrise=(int, ...), sunset=(int, ...))] = None
type: str