一、基础语法演示纯 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 langgraph2. 完整可运行代码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开始处理内容]逻辑说明初始messages []节点 A 返回[节点A...]框架执行[] [节点A...]节点 B 返回[节点B...]框架执行[节点A...] [节点B...]最终列表追加不会覆盖旧数据。三、对比默认覆盖 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]四、总结关键点Annotated[list[str], operator.add]第一层类型注解标明是字符串列表第二层合并回调函数给框架使用operator.add(a, b)a b列表场景就是尾部追加仅在 LangGraph / Pydantic 这类框架中会自动解析该规则原生 Python 只做注释。
[智能体-326]:messages: Annotated[list[str], operator.add], 这是什么语法
发布时间:2026/6/9 7:20:34
一、基础语法演示纯 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 langgraph2. 完整可运行代码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开始处理内容]逻辑说明初始messages []节点 A 返回[节点A...]框架执行[] [节点A...]节点 B 返回[节点B...]框架执行[节点A...] [节点B...]最终列表追加不会覆盖旧数据。三、对比默认覆盖 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]四、总结关键点Annotated[list[str], operator.add]第一层类型注解标明是字符串列表第二层合并回调函数给框架使用operator.add(a, b)a b列表场景就是尾部追加仅在 LangGraph / Pydantic 这类框架中会自动解析该规则原生 Python 只做注释。