用pydantic指定嵌套dict的最佳方式



上下文

我正在尝试使用pydantic验证/解析一些数据。

我想指定dict是否可以有一个密钥daytime。如果是,我希望daytime的值同时包括sunrisesunset

例如,这些应该被允许:

{
'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

相关内容

  • 没有找到相关文章

最新更新