news 2026/6/20 17:36:15

[智能体-329]:Annotated 通俗详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[智能体-329]:Annotated 通俗详解

一句话:Annotated就是给「数据类型」贴标签、加备注、绑规则本身不改类型,只是额外附带上说明 / 约束,常和 Pydantic、FastAPI 搭配使用。

一、先搞懂:为什么需要它?

平时写类型注解,只能单纯标注类型

python

运行

age: int

只能看出age是整数,但不知道取值范围、含义、填写规则

如果想额外加信息(比如:年龄 0~120、字段说明、校验规则),普通注解(age: int)做不到,这时候就用Annotated


二、基础用法

1. 导入

Python3.9+ 自带,直接导入:

python

运行

from typing import Annotated

3.8 及以下先装依赖:pip install typing-extensions,再从typing_extensions导入。

2. 固定语法

python

运行

Annotated[基础类型, 附加内容1, 附加内容2, ...]
  • 第一个参数原本的类型(int/str/ 列表等),必填
  • 后面所有参数随便加文字、规则、对象,都是附加信息,数量不限

3. 最简单示例(加文字备注)

python

运行

from typing import Annotated # 给 int 加说明:年龄,范围0-120 Age = Annotated[int, "用户年龄,取值 0 ~ 120"] # 使用,本质还是 int 类型 def get_age() -> Age: return 20 print(type(get_age())) # <class 'int'>,类型没变

✅ 关键点:底层类型完全不变附加内容只是 “附属信息”。


三、常见使用场景(由浅到深)

场景 1:纯文字注释(看代码 / 生成文档用)

给字段写中文说明,别人一看就懂,不用翻注释:

python

运行

from typing import Annotated # 字符串 + 备注:登录账号,4-20位 Username = Annotated[str, "登录账号,长度4~20位"] name: Username = "zhangsan"

场景 2:多条附加信息叠加

可以一次性加多个备注、标记:

python

运行

from typing import Annotated Phone = Annotated[ str, "中国大陆手机号", "必须11位数字", "不可为空" ] tel: Phone = "13800000000"

场景 3:搭配 PydanticField(最常用:绑定校验规则和类型自动转化)

这是工作中主力用法:把类型 + 校验规则打包在一起,还能重复使用。

普通写法(规则写在字段后,无法复用):

python

运行

from pydantic import BaseModel, Field class User(BaseModel): age: int = Field(ge=0, le=120)

Annotated改写(规则打包,全局复用):

python

运行

from typing import Annotated from pydantic import BaseModel, Field # 打包:int类型 + 年龄校验规则 AgeRule = Annotated[int, Field(ge=0, le=120, description="用户年龄")] # 模型里直接用,代码更干净 class User(BaseModel): age: AgeRule # 另一个模型,直接复用这套规则,不用重复写 Field class Student(BaseModel): age: AgeRule

对比总结:

  • 不用Annotated:规则散在每个字段里,重复代码多
  • Annotated类型 + 规则 封装成一个整体,一次定义,到处调用

场景 4:搭配 FastAPI(接口文档 + 参数校验)

接口开发标配,附加内容会自动展示在接口文档里:

python

运行

from fastapi import FastAPI from typing import Annotated app = FastAPI() @app.get("/hello") def say_hello( num: Annotated[int, "传入一个正整数", 1, 999] ): return {"number": num}

打开接口文档,能直接看到后面的文字说明。


四、运行时读取附加信息

如果代码里需要拿到你写的备注 / 规则,用__metadata__属性

python

运行

from typing import Annotated Info = Annotated[int, "测试数字", 0, 100] # 获取所有附加内容,返回元组 print(Info.__metadata__) # ('测试数字', 0, 100) # 获取原始基础类型 print(Info.__origin__) # <class 'int'>

五、核心特点总结(好记版)

  1. 不改变原类型Annotated[int, ...]到头来还是int,运算、类型判断不受影响。
  2. 附加内容自由后面可以写字符串、校验规则、对象,想加多少加多少。
  3. 核心价值:复用 + 解耦「类型 + 规则 + 说明」打包,一处定义,多处使用,减少重复代码。
  4. 主打搭档Pydantic、FastAPI是黄金组合,专门用来做数据约束、接口文档。

六、最简实战组合(日常开发直接抄)

python

运行

from typing import Annotated from pydantic import BaseModel, Field # 1. 统一封装通用字段规则 UserName = Annotated[str, Field(min_length=2, max_length=20, description="用户名")] UserAge = Annotated[int, Field(ge=0, le=120, description="年龄")] # 2. 模型直接引用 class User(BaseModel): name: UserName age: UserAge
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/20 17:30:33

告别手动调参!深入解读AB3DMOT提出的新评估指标:AMOTA/sAMOTA到底解决了什么痛点?

3D目标跟踪评估革命&#xff1a;AMOTA/sAMOTA如何重塑算法研发范式在自动驾驶和机器人感知领域&#xff0c;3D多目标跟踪(MOT)技术的进步正面临一个关键瓶颈——传统评估指标已无法满足算法迭代的需求。当研究人员花费数周时间调整置信度阈值只为在KITTI排行榜上提升0.1%的MOTA…

作者头像 李华
网站建设 2026/6/20 17:32:52

别再死记硬背了!用FFmpeg实战拆解音视频面试高频考点(附代码)

用FFmpeg拆解音视频面试核心&#xff1a;从命令到原理的实战指南音视频开发岗位的面试往往充斥着大量晦涩难懂的专业术语和抽象概念。传统备考方式依赖死记硬背&#xff0c;导致许多候选人在面对实际场景问题时束手无策。本文将彻底改变这一现状——通过20个FFmpeg实战案例&…

作者头像 李华
网站建设 2026/6/10 17:53:21

Python开发社区资源分享:助力你的学习与成长

在当今快速发展的科技时代&#xff0c;Python 作为一门简洁、高效且功能强大的编程语言&#xff0c;正受到越来越多开发者的青睐。无论你是初学者还是经验丰富的开发者&#xff0c;加入一个活跃的 Python 开发社区都能为你带来巨大的帮助。本文将为你分享一些优质的 Python 开发…

作者头像 李华
网站建设 2026/6/11 1:42:20

告别逐字编程!用C51定时器中断实现Proteus点阵的平滑滚动效果

C51定时器中断驱动Proteus点阵平滑滚动的工程实践 在嵌入式系统开发中&#xff0c;点阵显示器的动态效果实现一直是硬件编程的经典课题。传统基于delay函数的实现方式不仅占用CPU资源&#xff0c;还会导致显示效果出现明显卡顿。本文将深入探讨如何利用C51单片机的定时器中断机…

作者头像 李华