如何定义数据结构以同时满足mypy与Pydantic的要求
如何定义数据结构以同时满足mypy与Pydantic的要求
嘿,我来分享一个能同时兼容mypy类型检查和Pydantic数据验证的实现方案,下面是具体的代码和示例数据,你可以直接参考:
首先是数据结构的定义,我们用Pydantic的BaseModel来构建,同时搭配标准的类型注解,这样mypy能识别类型约束,Pydantic能完成数据校验和自动类型转换:
from pydantic import BaseModel, Field from typing import List, Optional from datetime import datetime class Vault(BaseModel): VaultARN: str VaultName: str CreationDate: datetime LastInventoryDate: Optional[datetime] = None NumberOfArchives: int SizeInBytes: int class VaultListResponse(BaseModel): VaultList: List[Vault]
这里的核心细节值得注意:
- 用
Optional[datetime]标注LastInventoryDate并设置默认值None,既让mypy明确这个字段是可选的(允许为datetime或None),也告诉Pydantic该字段非必填 - 直接使用
datetime类型,Pydantic会自动把符合ISO格式的字符串转换成datetime对象,mypy也能准确识别这个类型的约束 - 用
List[Vault]定义列表字段,明确列表内的元素类型,mypy可以在开发阶段检查列表元素的类型合规性,Pydantic会递归验证每个Vault对象的结构
接下来是测试用的示例数据,你可以用它来验证这个数据结构的有效性(我补全了原始数据里截断的部分):
# Example data data = { "VaultList": [ { "VaultARN": "arn:aws:glacier:eu-central-1:801680170242:vaults/ab_2017_bis_2022", "VaultName": "ab_2017_bis_2022", "CreationDate": "2022-07-05T08:37:25.552Z", "LastInventoryDate": "2024-09-14T18:54:58.863Z", "NumberOfArchives": 5712, "SizeInBytes": 28571666494 }, { "VaultARN": "arn:aws:glacier:eu-central-1:801680170242:vaults/photos-161218", "VaultName": "photos-161218", "CreationDate": "2021-02-01T12:00:00.000Z", "NumberOfArchives": 1245, "SizeInBytes": 15678901234 } ] }
当你用这个数据实例化VaultListResponse时,Pydantic会自动完成数据验证和类型转换,同时mypy也能在开发阶段帮你提前发现类型错误——比如如果给NumberOfArchives传了字符串,mypy会立刻给出提示,Pydantic在运行时也会抛出验证错误。
备注:内容来源于stack exchange,提问作者S.Benz
相关产品推荐
相关产品推荐

