当前位置: 首页 > 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.jsqmd.com/news/979715/

相关文章:

  • 清远闲置黄金变现攻略 六大回收门店横评 - 润富黄金回收
  • 旧电脑别扔!手把手教你用U盘给X86设备刷入原生Android TV 9(附ARM兼容开启教程)
  • 2026电子元器件派瑞林镀膜加工服务推荐榜:派瑞林镀膜工艺/派瑞林镀膜服务/派瑞林防水涂层/CVD设备/Parylene气相沉积设备/选择指南 - 优质品牌商家
  • Windows 10 + VS2019 保姆级教程:搞定OpenMVG 2.0编译与第一个3D重建
  • 2026年|应对AI检测算法:英文论文AI率居高不下?5个降AI方法实测盘点 - 降AI实验室
  • 别再死记硬背RC公式了!用Multisim仿真带你搞懂单片机复位电路里的电容怎么选
  • 从Parasolid实体到三角面片:深入解析PK_TOPOL_facet数据结构与内存管理实战
  • 深圳闲置黄金变现实测攻略:6家门店排名与安全变现指南 - 润富黄金回收
  • 文本嵌入与向量数据库:构建LLM知识问答系统的实战指南
  • 遥感图像分类新思路:我是如何用‘空间-光谱Transformer’在Kaggle比赛中提升5个点的
  • 告别配置地狱!手把手教你用VS2022和Intel oneAPI搞定OpenCL开发环境(附完整路径)
  • 清远黄金奢侈品回收实测盘点 - 润富黄金回收
  • 双曲空间多模态学习在恶意软件检测中的应用
  • 用grid_map玩转2.5D地图:在RViz中可视化你的机器人崎岖地形数据
  • 从网页监控到移动端查看:用Astra相机和ROS melodic搭建一个简易的远程3D点云监控系统
  • IDEA快捷键太多记不住?这20个高频组合键让你编码效率翻倍(附自定义技巧)
  • 别再让侧扫声呐图变马赛克!SonarWiz7导入Klein 4000数据的正确姿势(浮点型设置详解)
  • 2025-2026年久韵红家具电话查询:选购实木家具前需核实材质与合同条款 - 品牌推荐
  • 纯C语言三端教务系统源码:管理员/教师/学生各司其职,全靠文本文件存数据
  • 广东光伏哪家好:排名前五专业深度测评解析 - 服务品牌热点
  • 从硬件RSS到软件RPS:一张图看懂Linux网络收包优化全家桶(含XPS与Offload)
  • 别再手动算电压了!STM32CubeMX+DAC+DMA+TIM,10分钟搞定10KHz正弦波信号源
  • Transformer架构深度解析:从数学原理到工程落地
  • STM32F105+RT-Thread下OLED12864的硬件SPI+DMA驱动工程(KEIL完整项目)
  • 超越CBAM和SE:GAM注意力机制为何在ImageNet上更有效?深入解析其设计思想与消融实验
  • Navicat Premium 15连接MySQL 8.0报错10061?除了启动服务,这些隐藏配置项也得看一眼
  • 面试官最爱问的Transformer注意力:从PyTorch代码逐行拆解QKV计算(附避坑点)
  • 如何快速掌握抖音批量下载神器:面向新手的完整教程
  • 赤峰旺哥黄金回收6家正规门店实测 - 润富黄金回收
  • 2025-2026年安福门控电话查询:逃生自动门选型需关注安全资质与维保能力 - 品牌推荐