You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义数据结构以同时满足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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:43:00