当前位置: 首页 > news >正文

总结 TypedDict、Pydantic、Field、Annotated、Optional 等 Python 类型与校验工具的核心写法与组合方式

下面总结TypedDictPydanticFieldAnnotatedOptional这些 Python 类型与校验工具的核心写法与组合方式。


1.Optional—— 可选类型

作用:类型提示中表示“可以是某种类型,也可以是None”。等价于Union[T, None]

写法

fromtypingimportOptional name:Optional[str]=None# 变量可以是 str 或 None

在 Pydantic 中Optional[str]本身不设置默认值,需要配合= None才变为可选字段。

frompydanticimportBaseModelfromtypingimportOptionalclassUser(BaseModel):nickname:Optional[str]=None# 可选,默认 Noneage:Optional[int]# 必填!必须显式传值或 None

2.TypedDict—— 结构化字典(静态检查)

作用:定义字典的键名及对应值的类型,用于静态类型检查(mypy、Pyright),无运行时行为。

基本写法

fromtypingimportTypedDictclassUserDict(TypedDict):name:strage:int

可选字段(Python 3.11+ 或typing_extensions):

fromtypingimportTypedDictfromtyping_extensionsimportNotRequiredclassUserDict(TypedDict):name:strage:NotRequired[int]# 键 age 可以缺失

使用total=False(全部字段可选):

classUserDict(TypedDict,total=False):name:strage:int

注意TypedDict不支持Field、默认值、运行时验证。


3.Pydantic—— 运行时数据验证与解析

作用:通过BaseModel定义模型,自动完成类型转换、校验、序列化、文档生成。

基本写法

frompydanticimportBaseModelclassUser(BaseModel):name:strage:int

可选字段(默认值None):

classUser(BaseModel):name:strage:int=None# 等价于 Optional[int] = None# 或nickname:Optional[str]=None

运行时校验:实例化时自动检查类型,无效数据抛出ValidationError


4.Field—— Pydantic 字段元数据

作用:为 Pydantic 模型字段提供额外信息,如默认值、描述、验证约束、别名等。

基本写法

frompydanticimportBaseModel,FieldclassProduct(BaseModel):name:str=Field(...,min_length=1,description="产品名称")price:float=Field(gt=0,le=10000,description="价格")stock:int=Field(default=0,ge=0)

常用参数

  • default:默认值
  • default_factory:生成默认值的可调用对象
  • gt,ge,lt,le:数值范围
  • min_length,max_length:字符串长度
  • regex:正则表达式
  • description:描述(用于生成 JSON Schema)
  • alias:字段别名

5.Annotated—— 类型元数据容器

作用:Python 3.9+ 引入,将额外信息(如验证、描述)附着到类型上,供工具或库解析。

基本写法

fromtypingimportAnnotated# 附加一个字符串元数据UserName=Annotated[str,"用户的姓名"]

与 Pydantic 结合(最常用):

frompydanticimportBaseModel,Field,PositiveIntfromtypingimportAnnotatedclassUser(BaseModel):age:Annotated[int,Field(gt=0,lt=150,description="年龄")]score:Annotated[float,Field(ge=0,le=100)]uid:Annotated[int,PositiveInt()]# 使用 annotated-types 库的约束

TypedDict结合(Pydantic 支持):

fromtypingimportTypedDict,AnnotatedfrompydanticimportField,TypeAdapterclassUserDict(TypedDict):name:Annotated[str,Field(min_length=1)]age:Annotated[int,Field(gt=0)]# 运行时验证adapter=TypeAdapter(UserDict)data=adapter.validate_python({"name":"张三","age":25})

6. 组合对比:TypedDictvsPydantic BaseModel

特性TypedDictPydantic BaseModel
目的静态类型检查运行时验证 + 序列化
默认值Field(default=...)
可选字段NotRequiredtotal=FalseOptional[T] = None
字段描述Field(description=...)
数值约束Field(gt=0)
运行时类型转换✅(如"123"123
JSON Schema 生成❌(需第三方).model_json_schema()
内存/性能极低(纯字典)较高(模型实例)

7. 最佳实践组合建议

  • 仅需静态类型检查,无运行时逻辑TypedDict+NotRequired+Optional
  • 需要运行时校验 + 默认值 + API 文档Pydantic BaseModel+Field+Optional
  • 需要强约束但想用字典结构(例如已存在字典数据)TypedDict+Annotated+ Pydantic 的TypeAdapter
  • 复杂校验逻辑(跨字段验证):Pydantic 模型的@model_validator@field_validator

示例:一个企业级数据模型(Pydantic)

frompydanticimportBaseModel,Field,field_validatorfromtypingimportOptional,AnnotatedclassStudent(BaseModel):name:Annotated[str,Field(min_length=2,max_length=20)]age:Annotated[int,Field(ge=6,le=30)]gender:Optional[str]=Field(None,pattern="^(男|女|其他)$")grades:list[int]=Field(default_factory=list,max_items=50)@field_validator("grades")defcheck_grades(cls,v):ifany(g<0org>100forginv):raiseValueError("成绩必须在 0~100 之间")returnv

8. 关键易错点

  • Optional[T]不等于T | None语义相同,但Optional[T] = None才使字段可选,若只写Optional[T]仍是必填。
  • TypedDict的字段名在运行时是普通字典键,不会被转换为属性。
  • Annotated中的元数据顺序可任意,但通常第一个是类型,后面跟多个元数据项。
  • Pydantic 的Field(default=...)Annotated结合时,避免在Annotated内外重复定义默认值,会导致歧义。
http://www.jsqmd.com/news/626430/

相关文章:

  • 手把手教你用TRAE+GPT5打造高效番茄计时器(附完整代码)
  • CISSP域3知识点 安全工程基础
  • StarWayDI:工业数据寻优新利器
  • AI原生DevSecOps实施路径图(2026企业级验证版):从PoC失败率73%到SLO达标率98.6%的跃迁
  • Python量化投资第一步:用baostock轻松获取A股历史数据(附完整代码)
  • 保姆级教程:用PaLI-X和PaLM-E微调你自己的RT-2风格机器人模型(附避坑指南)
  • 2026届必备的六大AI科研助手解析与推荐
  • 嵌入式TFT驱动库:16MHz SPI与屏幕翻转协同优化
  • CentOS 7.6服务器上,用FileZilla搞定VOS3000 8.0安装与授权(附详细命令)
  • 基于 TMS320F28335 的 EPWM 模块移相控制技术研究
  • 打造沉浸式智能AI问答助手:Vue + UniApp 全端实战(支持 Markdown/公式/多模态交互)姑
  • 等保.三级要求下Redis 安全测评应该怎么做?懊
  • 2026技术分享:全地形摩托车/全地形水陆两栖车/全地形车报价/八轮全地形车/双人全地形车/水陆两栖全地形地震救援车/选择指南 - 优质品牌商家
  • ard2pmod:Arduino与PMOD接口的硬件抽象与DS3231高精度RTC集成
  • Qwen3-VL-8B Web系统入门必看:从零搭建含前端/代理/vLLM的全栈AI聊天环境
  • 深入解析LDO trim修调技术:关键影响因素与优化策略
  • AI原生敏捷开发落地指南(Gartner 2024验证:交付周期压缩63%的关键转折点)
  • 5分钟快速解锁QQ音乐加密文件:qmcdump终极指南
  • 丙午年二月廿二惊雷声
  • RAG评估实战指南:三大质量指标与四大核心能力的自动化验证
  • 2026年国标仿木护栏技术全解析:国标仿木栏杆/成都仿木护栏厂家/成都仿木栏杆厂家/成都仿树藤栏杆厂家/成都仿石护栏厂家/选择指南 - 优质品牌商家
  • 从领域驱动到本体论:AI 时代的架构方法论变了戎
  • 从 Apache SeaTunnel 走向 ASF Member:一位开发者的长期主义样本辆
  • 2026届最火的十大AI写作助手解析与推荐
  • 解决若依vue微信图片无法显示的问题
  • 深度解析OBS多平台推流插件:5大实战配置策略实现高效直播分发
  • PanderaPolars的无效行获取技巧
  • 得意黑Smiley Sans:一款能让你爱上中文排版的窄斜体黑体终极指南
  • 【档案管理】“十五五”趋势下,档案行业的必答题,规划背景及政策分析
  • 数字图像处理(4版)——第1章——引言(Rafael C.GonzalezRichard E. Woods)