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

[智能体-326]:messages: Annotated[list[str], operator.add], 这是什么语法

一、基础语法演示(纯 Python,无第三方库)

Annotated只是带元数据的类型注解operator.add是附加的自定义规则,原生 Python 不会自动执行规则,仅做标记。

python

运行

from typing import Annotated import operator # 定义变量:类型 list[str],附加元数据 operator.add messages: Annotated[list[str], operator.add] = ["你好"] # 手动模拟「合并逻辑」(对应框架内部逻辑) new_msg = ["今天天气不错"] # operator.add(a, b) 等价于 a + b messages = operator.add(messages, new_msg) print(messages)

输出:

plaintext

['你好', '今天天气不错']

二、核心场景:LangGraph 状态合并(最常用)

LangGraph 会自动读取 Annotated 里的合并函数,多节点更新状态时执行对应逻辑。

1. 安装依赖

bash

运行

pip install langgraph

2. 完整可运行代码

python

运行

from typing import Annotated import operator from langgraph.graph import StateGraph, START, END # 1. 定义状态类 class ChatState(dict): # 关键写法:列表类型 + 合并规则 = 列表相加(追加) messages: Annotated[list[str], operator.add] # 2. 定义节点函数(每个节点都会更新 messages) def node_a(state: ChatState) -> ChatState: return {"messages": ["节点A:我收到请求了"]} def node_b(state: ChatState) -> ChatState: return {"messages": ["节点B:开始处理内容"]} # 3. 构建图 builder = StateGraph(ChatState) builder.add_node("A", node_a) builder.add_node("B", node_b) # 流转:START → A → B → END builder.add_edge(START, "A") builder.add_edge("A", "B") builder.add_edge("B", END) # 编译运行 graph = builder.compile() # 初始状态:空列表 result = graph.invoke({"messages": []}) # 打印最终结果 print(result["messages"])

运行结果

plaintext

['节点A:我收到请求了', '节点B:开始处理内容']

逻辑说明

  1. 初始messages = []
  2. 节点 A 返回["节点A:..."],框架执行[] + ["节点A..."]
  3. 节点 B 返回["节点B:..."],框架执行["节点A..."] + ["节点B..."]
  4. 最终列表追加,不会覆盖旧数据。

三、对比:默认覆盖 vs operator.add 追加

1. 不写 operator.add(默认覆盖)

python

运行

from typing import Annotated from langgraph.graph import StateGraph, START, END class ChatState(dict): # 无合并函数:默认直接覆盖原值 messages: list[str] def node_a(state): return {"messages": ["A 消息"]} def node_b(state): return {"messages": ["B 消息"]} builder = StateGraph(ChatState) builder.add_node("A", node_a) builder.add_node("B", node_b) builder.add_edge(START, "A") builder.add_edge("A", "B") builder.add_edge("B", END) graph = builder.compile() res = graph.invoke({"messages": []}) print(res["messages"]) # 只保留最后一个:['B 消息']

2. 自定义合并函数(拓展用法)

不用operator.add,自己写合并逻辑:

python

运行

from typing import Annotated from langgraph.graph import StateGraph, START, END # 自定义合并:新列表放前面 def merge_func(old_list, new_list): return new_list + old_list class ChatState(dict): messages: Annotated[list[str], merge_func] def node_a(state): return {"messages": ["A"]} def node_b(state): return {"messages": ["B"]} builder = StateGraph(ChatState) builder.add_node("A", node_a) builder.add_node("B", node_b) builder.add_edge(START, "A") builder.add_edge("A", "B") builder.add_edge("B", END) graph = builder.compile() res = graph.invoke({"messages": []}) print(res["messages"]) # ['B', 'A']

四、总结关键点

  1. Annotated[list[str], operator.add]
    • 第一层:类型注解,标明是字符串列表
    • 第二层:合并回调函数,给框架使用
  2. operator.add(a, b)=a + b,列表场景就是尾部追加
  3. 仅在 LangGraph / Pydantic 这类框架中会自动解析该规则,原生 Python 只做注释。
http://www.gsyq.cn/news/1491447.html

相关文章:

  • 旧电脑别扔!手把手教你用U盘给X86设备刷入原生Android TV 9(附ARM兼容开启教程)
  • 光子关联函数与量子发射体系统的高效计算
  • 锐捷无线控制器VAC模式切换全流程解析:从独立模式到虚拟化集群的完整操作与配置恢复
  • 别再死记硬背了!用Python Matplotlib手把手教你画出CIE1931色度图与黑体轨迹
  • 双曲几何在树形结构嵌入中的应用与实践
  • 2026年|应对AI检测算法:英文论文AI率居高不下?5个降AI方法实测盘点 - 降AI实验室
  • 从Parasolid实体到三角面片:深入解析PK_TOPOL_facet数据结构与内存管理实战
  • 清远黄金奢侈品回收实测盘点 - 润富黄金回收
  • 遥感图像分类新思路:我是如何用‘空间-光谱Transformer’在Kaggle比赛中提升5个点的
  • 2025-2026年久韵红家具电话查询:选购实木家具前需核实材质与合同条款 - 品牌推荐
  • 别再让侧扫声呐图变马赛克!SonarWiz7导入Klein 4000数据的正确姿势(浮点型设置详解)
  • 面试官最爱问的Transformer注意力:从PyTorch代码逐行拆解QKV计算(附避坑点)
  • Navicat Premium 15连接MySQL 8.0报错10061?除了启动服务,这些隐藏配置项也得看一眼
  • Mythos安全能力跃迁:AI如何重构软件攻防范式
  • 别再只用scatter3了!MATLAB三维数据可视化,plot3和scatter3的保姆级选择指南
  • 推断统计实战指南:从抽样到可信结论的完整链路
  • QLoRA微调BERT实战:4-bit量化+低秩适配的轻量化落地
  • 2025-2026年FACE(飞斯)自动门电话查询:选购前需关注产品资质与维保细节 - 品牌推荐
  • 2026年全国垃圾房厂家盘点:城市公交站台/成品垃圾房/智慧垃圾房/智能公交站台/环保垃圾房/铝合金公交站台/不锈钢公交站台/选择指南 - 优质品牌商家
  • 手把手教你用Python写个最简单的Whitted光线追踪渲染器(附完整代码)
  • 威海黄金奢侈品回收门店全测评 本地变现攻略 - 润富黄金回收
  • 告别卡顿!手把手教你将TUM RGBD的tgz包转成30Hz流畅bag(附Python脚本详解)
  • 深圳黄金回收门店横评:6家正规渠道实测与变现建议 - 润富黄金回收
  • XUnity自动翻译器:打破语言壁垒,轻松畅玩全球Unity游戏的终极指南 [特殊字符]
  • 2026年太仓铝合金压铸厂家选购指南:精密压铸、液态模锻、铝件锻造定制厂家选择指南,产能、工艺、品控三维度权威解析 - 海棠依旧大
  • 从方块到腔体:手把手用CST微波工作室的布尔与抽壳功能,快速构建一个波导滤波器模型
  • 威海闲置黄金变现门店实测盘点 - 润富黄金回收
  • RT1064的FlexPWM配置避坑指南:为什么你的PWM输出不了?从故障保护到寄存器加载的实战解析
  • 多资产交易场景下网络钓鱼攻击特征与防御技术研究
  • 别再用全局变量了!用GCC的__attribute__((section))实现模块化自动初始化(附RT-Thread/OneOS源码解析)