FastMCP 2.9 版本詳解:MCP 原生中間件與類型轉換增強

下面我將從三個方面來講解這個,第一是講解2.9版本的更新,第二是講解什么將手動解析底層JSON-RPC 消息,丟失 FastMCP 高層語義,第三是講一講,什么叫做中間件。不了解的兄弟們系好安全帶,我們準備發車了!

一、中間件系統的革命性升級
1. 傳統中間件方案的痛點
  • 局限性
    • 僅支持 web 傳輸(如 HTTP、SSE),無法用于本地 STDIO 傳輸
    • 需手動解析底層 JSON-RPC 消息,丟失 FastMCP 高層語義(如 Tool、Resource 對象)
  • 后果:開發者需處理協議細節,增加開發復雜度與維護成本
2. MCP 原生中間件的設計理念
  • 核心原則:聚焦開發者意圖,而非協議復雜性
  • 創新點:直接封裝高層語義處理邏輯(工具、資源、提示),而非底層協議流
  • 優勢
    • 支持所有傳輸協議(包括 STDIO)
    • 基于語義鉤子實現精準控制
    • 保持代碼與 FastMCP 組件的高內聚性
二、中間件實現與核心鉤子
1. 基礎日志中間件示例
from fastmcp import FastMCP
from fastmcp.server.middleware import Middleware, MiddlewareContextclass LoggingMiddleware(Middleware):async def on_message(self, context: MiddlewareContext, call_next):"""處理所有 MCP 消息的鉤子"""print(f"-> 接收消息: {context.method}")result = await call_next(context)  # 調用下一個處理器print(f"<- 響應消息: {context.method}")return resultmcp = FastMCP(name="My Server")
mcp.add_middleware(LoggingMiddleware())
2. 語義級權限控制中間件
from fastmcp import FastMCP, Context
from fastmcp.exceptions import ToolError
from fastmcp.server.middleware import Middleware, MiddlewareContextclass PrivateMiddleware(Middleware):async def on_call_tool(self, context: MiddlewareContext, call_next):"""專門處理工具調用的鉤子"""tool_name = context.message.nametool = await context.fastmcp_context.fastmcp.get_tool(tool_name)if "private" in tool.tags:raise ToolError(f"禁止訪問私有工具: {tool_name}")return await call_next(context)mcp = FastMCP(name="Private Server")
@mcp.tool(tags={"private"})
def super_secret_function():return "這是秘密!"
mcp.add_middleware(PrivateMiddleware())
3. 核心鉤子函數列表
鉤子函數觸發場景典型用途
on_message所有消息類型通用日志、請求統計
on_request請求-響應模式消息身份驗證、參數校驗
on_notification單向通知消息異步任務記錄
on_call_tool工具調用請求權限控制、工具調用頻率限制
on_access_resource資源訪問請求資源訪問審計
三、內置中間件模板

FastMCP 2.9 預實現了常見場景的中間件模板:

  1. 日志記錄fastmcp.server.middleware.logging
    • 自動記錄所有請求與通知的輸入輸出
  2. 錯誤處理fastmcp.server.middleware.error_handling
    • 捕獲異常并實現重試策略(如指數退避)
  3. 速率限制fastmcp.server.middleware.rate_limiting
    • 基于 IP 或客戶端標識限制請求頻率
  4. 性能監控fastmcp.server.middleware.timing
    • 記錄工具調用耗時,支持性能瓶頸分析
四、提示參數的自動類型轉換
1. 痛點解決:告別手動 JSON 解析
  • 舊流程問題
    • MCP 規范要求提示參數為字符串
    • 開發者需手動執行 json.loads() 解析結構化數據(如列表、字典)
  • 新特性優勢
    • 直接使用 Python 原生類型定義提示函數參數
    • 服務器自動完成字符串到類型的轉換
    • 自動生成 JSON 模式描述,指導 LLM 輸入格式
2. 類型轉換示例
from fastmcp import FastMCP
import inspectmcp = FastMCP()@mcp.prompt
def analyze_users(user_ids: list[int],  # 自動從 JSON 字符串轉換為整數列表analysis_type: str,
) -> str:"""生成用戶分析提示"""users = []for user_id in user_ids:user = db.get_user(user_id)  # 假設的數據庫查詢users.append(f"- {user_id}: {user.name}, {user.metrics}")user_data = "\n".join(users)return inspect.cleandoc(f"""分析這些用戶的{analysis_type}洞察:{user_data}提供可操作的建議。""")
3. 客戶端與服務端協同
  • 客戶端調用
    # 客戶端傳入 JSON 字符串
    await client.call_prompt("analyze_users", {"user_ids": "[1, 2, 3]","analysis_type": "performance"
    })
    
  • 服務端接收
    • user_ids 自動轉換為 list[int] 類型
    • 提示描述中自動添加 JSON 模式說明(如 user_ids: array of integers
五、從協議到框架的進化
1. 核心能力升級
  • 中間件系統:實現橫切關注點(認證、日志、限流)的標準化處理
  • 類型系統增強:提升提示參數的開發體驗與可靠性
  • 生態整合:兼容 MCP 規范的同時,提供更貼近 Python 開發習慣的接口
2. 生產環境價值
  • 開發效率:減少底層協議處理代碼,聚焦業務邏輯
  • 系統穩定性:通過中間件統一處理異常、限流等非功能需求
  • 可維護性:語義級中間件使系統架構更清晰,便于團隊協作
六、升級與資源
  1. 升級命令
    # 使用 uv 包管理器
    uv add fastmcp# 或使用 pip
    pip install fastmcp --upgrade
    
  2. 學習資源
    • 中間件文檔
    • 類型轉換示例
    • FastMCP 社區論壇
七、版本核心價值總結

FastMCP 2.9 通過MCP 原生中間件提示參數類型轉換兩大特性,實現了從"協議工具"到"應用框架"的關鍵跨越:

  • 中間件:提供與 MCP 組件深度集成的橫切邏輯處理方案,解決傳統 ASGI 中間件的局限性
  • 類型系統:消除提示參數處理中的 JSON 解析痛點,提升開發者體驗與代碼可靠性
  • 框架化:結合 2.8 版本的工具轉換與標簽過濾,形成完整的生產級 MCP 應用開發體系

這些改進使 FastMCP 更適合構建復雜的 AI 代理系統,為企業級應用提供了堅實的技術基礎。

這句話描述了 FastMCP 在引入原生中間件之前,使用傳統中間件方案時面臨的核心問題,需要從技術實現原理和開發體驗兩個層面理解:

一、JSON-RPC 協議與 FastMCP 高層語義的區別

1. JSON-RPC 協議(底層)
  • 本質:一種輕量級遠程過程調用協議,通過 JSON 格式消息實現通信
  • 消息結構
    {"jsonrpc": "2.0","method": "call_tool","params": {"name": "Ford"},"id": "1"
    }
    
  • 特點:僅定義消息格式和傳輸規范,不關心業務語義(如"這是一個工具調用")
2. FastMCP 高層語義(應用層)
  • 抽象對象
    • Tool:可調用的功能函數(如 greet 工具)
    • Resource:可訪問的資源(如數據庫記錄)
    • Prompt:LLM 提示模板
  • 語義理解:FastMCP 會將 JSON-RPC 消息解析為具體的組件操作,例如:
    • 收到 call_tool 消息 → 識別為"調用某個工具"
    • 攜帶 user_ids 參數 → 關聯到具體工具的參數定義

二、"手動解析 JSON-RPC 消息"的含義

1. 傳統中間件的工作方式
  • 場景:若使用 ASGI 等傳統中間件包裹 FastMCP 服務器
  • 問題:中間件只能獲取原始 JSON-RPC 字符串,無法直接識別為 Tool 調用
  • 示例
    # 傳統中間件中收到的消息
    raw_message = '{"jsonrpc":"2.0","method":"call_tool","params":{"name":"Ford"},"id":"1"}'# 開發者需手動解析
    import json
    message = json.loads(raw_message)
    method = message.get("method")
    params = message.get("params")
    
  • 后果:所有 FastMCP 提供的高層抽象(如 Tool 對象、參數類型校驗)全部丟失,開發者需從頭處理協議細節

三、"丟失高層語義"的具體影響

1. 開發效率下降
  • 無法直接使用 context.fastmcp_context.fastmcp.get_tool() 等高層接口
  • 需手動映射 method 字段到具體組件(如判斷 method="call_tool" 才知道是工具調用)
2. 功能實現復雜化
  • 權限控制示例:傳統方案需:
    1. 解析 JSON 確定調用的工具名稱
    2. 手動查詢工具是否存在及標簽
    3. 處理權限邏輯
  • 對比:FastMCP 2.9 原生中間件可直接通過 on_call_tool 鉤子獲取 Tool 對象,無需解析 JSON:
    # 原生中間件中直接操作 Tool 對象
    tool = await context.fastmcp_context.fastmcp.get_tool(tool_name)
    if "private" in tool.tags:raise ToolError(...)
    
3. 錯誤風險增加
  • 手動解析 JSON 可能遺漏字段(如 idjsonrpc 版本)
  • 無法利用 FastMCP 內置的參數校驗和類型轉換能力

四、FastMCP 2.9 如何解決該問題

1. 原生中間件的核心改進
  • 語義感知:中間件鉤子直接基于高層組件(ToolResource)設計,而非 JSON 消息
  • 上下文傳遞:通過 MiddlewareContext 提供完整的 FastMCP 上下文,可直接訪問組件元數據
  • 示例對比
    # 傳統中間件(需手動解析)
    class OldMiddleware:async def __call__(self, scope, receive, send):# 處理 scope 和 receive 中的原始數據message = await receive()raw_json = message.get("body", b"")# ... 手動解析 JSON ...# FastMCP 2.9 原生中間件(直接操作語義)
    class NewMiddleware(Middleware):async def on_call_tool(self, context, call_next):# 直接獲取工具名稱和對象tool_name = context.message.nametool = await context.fastmcp_context.fastmcp.get_tool(tool_name)# ... 處理工具邏輯 ...
    
2. 核心價值:聚焦業務邏輯而非協議細節
  • 開發者無需關心 JSON-RPC 格式,只需關注"工具調用"、"資源訪問"等業務語義
  • 中間件邏輯與 FastMCP 組件深度集成,提升代碼復用性和可維護性

五、總結:問題本質與解決方案

維度傳統中間件方案FastMCP 2.9 原生中間件
處理對象原始 JSON-RPC 字符串FastMCP 高層組件(Tool、Resource 等)
開發者工作手動解析 JSON、映射語義直接操作語義對象,利用上下文鉤子
核心痛點丟失 FastMCP 封裝的高層抽象,開發成本高保留語義抽象,聚焦業務邏輯
典型場景權限控制需解析 JSON 再查工具標簽權限控制可直接訪問 Tool.tags 屬性

該問題的本質是"底層協議處理與高層應用邏輯的脫節",而 FastMCP 2.9 通過原生中間件實現了兩者的無縫銜接,使開發者能夠以更自然的方式處理跨切面需求。

中間件的全面解析:定義、分類與核心價值

一、中間件的本質定義與核心功能

中間件是位于操作系統、網絡與應用程序之間的軟件層,其核心作用是連接不同系統組件并提供通用服務,避免開發者重復實現底層交互邏輯。它如同“數字膠水”,通過抽象底層復雜性,讓應用程序更專注于核心業務邏輯。

  • 技術定位
    • 介于底層基礎設施(如操作系統、數據庫)與上層應用之間
    • 解決分布式系統中組件間的通信、集成與協同問題
  • 核心價值
    • 復用性:封裝認證、日志、消息傳遞等通用功能
    • 解耦性:分離應用邏輯與技術細節(如協議轉換、數據格式處理)
    • 標準化:提供統一接口,簡化異構系統集成
二、中間件的發展與應用場景

中間件技術自20世紀60年代末誕生以來,已成為現代軟件架構的基礎組件,尤其在云原生、微服務等場景中不可或缺。

  • 典型應用場景
    1. 新應用開發:提供Web服務器、緩存、消息隊列等基礎運行時環境
    2. 傳統應用現代化:將單體應用重構為云原生架構(如容器化、微服務拆分)
    3. 系統集成:連接企業內部ERP、CRM等異構系統及SaaS服務
    4. API管理:統一管理API的發布、路由、限流與安全策略
    5. 數據流處理:支持實時數據同步與異步消息傳遞(如Apache Kafka)
三、中間件的核心分類與代表產品

中間件根據功能特性可分為9大典型類別,每類解決特定領域的技術問題:

1. Web服務器中間件

功能:處理HTTP請求,托管靜態/動態資源,支持反向代理與負載均衡
代表產品

  • Apache HTTP Server:開源、跨平臺的經典Web服務器
  • Nginx:高性能輕量級服務器,擅長高并發場景下的反向代理
2. 數據庫中間件

功能:管理數據庫連接、分片、讀寫分離及故障轉移
代表產品

  • MySQL Proxy:開源的MySQL負載均衡與查詢緩存工具
  • Oracle RAC:商業級數據庫集群解決方案,提供高可用性
3. 消息中間件

功能:實現分布式系統的異步通信,解耦應用組件
代表產品

  • Apache Kafka:高吞吐量的分布式消息系統,支持實時流處理
  • RabbitMQ:基于AMQP協議的開源消息隊列,適合復雜路由場景
4. 緩存中間件

功能:緩存熱點數據,減少數據庫訪問壓力,提升響應速度
代表產品

  • Redis:開源內存數據庫,支持復雜數據結構與分布式部署
  • Memcached:高性能分布式內存緩存,適合簡單鍵值對場景
5. 應用服務器中間件

功能:運行應用程序的業務邏輯,提供事務管理、資源池等服務
代表產品

  • Apache Tomcat:輕量級Java Web容器,用于部署Servlet應用
  • JBoss/EAP:開源的企業級Java應用服務器,支持復雜業務場景
6. 事務中間件

功能:保證分布式系統中的數據一致性,處理跨服務事務
代表方案

  • 兩階段提交(2PC):經典分布式事務協議,確保原子性
  • Saga模式:將長事務拆分為本地事務,適合最終一致性場景
  • TCC(Try-Confirm-Cancel):三階段事務模型,支持柔性事務
7. 安全中間件

功能:保護應用與數據安全,提供認證、授權、加密等能力
代表產品

  • Web應用防火墻(WAF):攔截Web層惡意攻擊(如SQL注入)
  • 傳輸層安全(TLS):加密網絡通信,防止數據竊聽
  • 訪問管理(AM):統一身份認證與權限控制
8. 日志中間件

功能:收集、存儲、分析系統日志,支持問題定位與運維監控
代表產品

  • ELK Stack(Elasticsearch+Logstash+Kibana):開源日志管理平臺
  • Fluentd:輕量級日志收集工具,支持多源數據處理
9. 監控中間件

功能:實時監控系統狀態、資源使用與性能指標
代表產品

  • Nagios:老牌開源監控工具,支持服務器與網絡設備監控
  • Zabbix:企業級監控解決方案,提供豐富的告警與可視化功能
四、中間件在云計算與現代架構中的角色

在云原生與混合云環境中,中間件已從“可選組件”變為“基礎架構核心”:

  • 云原生支持
    • 容器層:管理應用生命周期(如Kubernetes集成)
    • 運行時層:提供微服務框架、服務網格(如Istio)
    • 集成層:連接SaaS服務與本地系統,支持API全生命周期管理
  • 關鍵價值
    1. 跨平臺一致性:確保應用在本地、公有云、私有云等環境中統一運行
    2. 規模化效率:支持數千節點的分布式系統協同工作
    3. 安全與合規:內置DevSecOps能力,滿足企業級安全要求
    4. 自動化運維:通過中間件實現故障自愈、彈性擴縮容
五、中間件與API的關系

API(應用編程接口)與中間件緊密關聯,但本質不同:

  • API:定義應用間通信的協議與接口規范(如REST、gRPC)
  • 中間件:實現API管理、路由、安全控制等具體功能的軟件組件
  • 協同作用
    • 中間件通過API提供服務(如API網關管理接口訪問)
    • API依賴中間件實現跨系統調用的底層通信(如消息中間件傳輸API請求)
六、總結:中間件的技術本質與未來趨勢

中間件的核心價值在于抽象復雜性、提升開發效率、增強系統可維護性。從早期的數據庫連接池到如今的云原生服務網格,其演進始終圍繞“讓開發者更專注業務邏輯”這一目標。未來,隨著AI、邊緣計算等技術的發展,中間件將進一步向智能化、輕量化方向進化,成為支撐企業數字化轉型的關鍵技術底座。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/85998.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/85998.shtml
英文地址,請注明出處:http://en.pswp.cn/web/85998.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LTspice仿真6——PWL折線波產生

1.自定義波形 2.自定義波形周期 3.以文件.txt的形式定義折線波 4.通過C語言編程&#xff0c;一系列操作&#xff0c;生成自定義正弦波&#xff08;可自定義性強&#xff09;

FunASR搭建語音識別服務和VAD檢測

調整VAD參數 1. 查找VAD模型的配置文件 FunASR中的VAD模型為FSMN-VAD&#xff0c;參數配置類為VADXOptions&#xff0c;可以在以下路徑中找到&#xff1a; /workspace/FunASR/runtime/python/onnxruntime/funasr_onnx/utils/e2e_vad.py 其中&#xff0c;VADXOptions類定義了…

多模態大模型(從0到1)

文章目錄 一、多模態大模型二、常見模態組合 典型應用場景三、多模態&#xff08;模型 框架&#xff09;1. 多模態模型2. 多模態框架 —— 開源項目推薦&#xff08;可快速上手&#xff09; 四、入門與學習路線1. 理論基礎2. 主流多模態模型實戰3. 進階與應用拓展&#x1f4d…

# Vue.js 精確輪播組件實現詳解

## &#x1f4d6; 概述 本文詳細介紹了一個基于 Vue.js 開發的高精度輪播組件&#xff0c;該組件實現了精確的卡片對齊和平滑滾動效果。組件支持混合布局&#xff08;大卡片網格布局&#xff09;&#xff0c;具備智能位置計算和精確滾動控制功能。 ## ? 組件特點 ### &#x1…

將RESP.app的備份數據轉碼成AnotherRedisDesktopManager的格式

將RESP.app的備份數據轉碼成AnotherRedisDesktopManager的格式 最近發現了AnotherRedisDesktopManager&#xff0c;這個軟件可以直接展示proto數據。 將RESP.app導出的json文件&#xff0c;轉碼為AnotherRedisDesktopManager的ano文件&#xff08;是一個list轉了base64&#xf…

前端基礎知識JavaScript系列 - 09(JavaScript原型,原型鏈 )

一、原型 JavaScript 常被描述為一種基于原型的語言——每個對象擁有一個原型對象 當試圖訪問一個對象的屬性時&#xff0c;它不僅僅在該對象上搜尋&#xff0c;還會搜尋該對象的原型&#xff0c;以及該對象的原型的原型&#xff0c;依次層層向上搜索&#xff0c;直到找到一個…

vue3+ts 使用VueCropper實現剪切圖片

效果圖&#xff1a; 參考文檔&#xff1a; Vue-Cropper 文檔Vue-Cropper 文檔 安裝VueCropper //npm安裝 npm install vue-croppernext -d --save//yarn安裝 yarn add vue-croppernext 引入組件 在main.ts中全局注冊&#xff1a; import VueCropper from vue-cropper; i…

el-table特殊表頭樣式

el-table特殊表頭樣式 實現表頭是按鈕 <el-table-column align"center"><template slot"header"><el-buttonsize"mini"type"primary"icon"el-icon-plus"circleclick"addData"></el-button&g…

el-tree的屬性render-content自定義樣式不生效

需求是想要自定義展示el-tree的項&#xff0c;官網有一個:render-content屬性&#xff0c;用的時候發現不管是使用class還是style&#xff0c;樣式都沒有生效&#xff0c;還會報一個錯&#xff0c;怎么個事呢&#xff0c;后來發現控制臺還會報一個錯“vue.js:5129 [Vue warn]: …

銀杏書簽里的春天

春末的細雨沾濕了舊書扉頁&#xff0c;我在泛黃的《飛鳥集》里發現那枚銀杏書簽時&#xff0c;窗外的梧桐樹正抖落最后一片枯葉。深褐色的葉脈間夾著張字條&#xff0c;娟秀的字跡被歲月暈染&#xff1a;"給永遠在奔跑的人。" 十年前的我在舊書店打工&#xff0c;每天…

spring-ai 1.0.0 學習(十四)——向量數據庫

向量數據庫是AI系統中常用的工具&#xff0c;主要用來存儲文檔片段及進行語義相似度查找 與傳統數據庫不同&#xff0c;它執行的是相似度查找而不是精確匹配 最小化樣例 首先在application.properties中&#xff0c;根據所用Embedding模型&#xff0c;添加一個嵌入式模型型號…

Spring Boot 的Banner的介紹和設置

Spring Banner 是指在 Spring Boot 應用啟動時,控制臺上顯示的那一段 ASCII 藝術字(通常是 Spring 的 logo),以及一些應用信息。 Banner 是 Spring Boot 提供的一個小但有趣的功能,可以讓應用程序啟動時更具個性也顯得更高級。 默認 Banner Spring Boot 內置了一個默認…

魅族“換血”出牌:手機基本盤站不穩,想靠AI和汽車“改命”

撰稿|何威 來源|貝多財經 被吉利收購后&#xff0c;魅族逐漸轉向在AI領域躬身耕作。 自2024年2月以“All in AI”正式宣告轉型、喊出不再推出傳統智能手機的豪言開始&#xff0c;這家曾以設計見長的手機廠商&#xff0c;將下半場押注在AI終端、AR眼鏡與智能座艙系統上&#…

力扣熱題100之將有序數組轉換為二叉搜索樹

題目 給你一個整數數組 nums &#xff0c;其中元素已經按 升序 排列&#xff0c;請你將其轉換為一棵 平衡 二叉搜索樹。 代碼 使用遞歸的方法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # s…

mac隱藏文件現身快捷鍵

在 macOS 系統中&#xff0c;?顯示/隱藏隱藏文件? 有兩種常用方法&#xff0c;以下是詳細說明&#xff1a; ? 方法一&#xff1a;使用快捷鍵&#xff08;最簡單&#xff09; 打開 ?訪達&#xff08;Finder&#xff09;?。 進入任意文件夾&#xff08;如桌面或文檔&#x…

IAR Workspace 中 Debug 與 Release 配置的深度解析

IAR Workspace 中 Debug 與 Release 配置的深度解析 一、配置的本質區別 1. 核心目標對比 特性Debug 配置Release 配置優化目標調試友好性性能/尺寸優化代碼優化無或低優化 (-O0/-O1)高級優化 (-O2/-O3/-Oz)調試信息包含完整符號信息無或最小化符號斷言檢查啟用通常禁用輸出…

Ubuntu下安裝python3

一、下載python3源碼 以要安裝的是python3.13.5為例&#xff0c;在 Index of /ftp/python/3.13.5/ 下載Python-3.13.5.tgz&#xff1a; 將壓縮包上傳到Ubuntu系統中&#xff0c;解壓&#xff1a; tar -zxvf Python-3.13.5.tgz 二、安裝 進入解壓后的源碼目錄&#xff1a; c…

計算機基礎和Java編程的練習題

1. 計算機的核心硬件是什么&#xff1f;各自有什么用&#xff1f; 中央處理器&#xff08;CPU&#xff09;&#xff1a;負責執行程序中的指令&#xff0c;進行算術和邏輯運算&#xff0c;是計算機的“大腦”。 內存&#xff08;RAM&#xff09;&#xff1a;臨時存儲CPU正在處…

橋頭守望者

趙阿姨在324國道邊的便利店守了八年柜臺&#xff0c;她的記賬本里藏著特殊的日歷——那些標著KLN字母的運輸單據總在固定日期出現&#xff0c;精確得像是節氣。"比氣象臺還準"&#xff0c;她指著玻璃窗上凝結的水珠說。去年寒潮來襲時&#xff0c;她親眼看見送貨員小…

C語言函數的參數傳遞和C++函數的參數傳遞

文章目錄 C語言值傳遞地址傳遞 C引用傳遞 C語言 值傳遞 這種方式使用變量、數組元素作為函數參數&#xff0c;實際是將實參的值復制到形參相應的存儲單元中&#xff0c;即形參和實參分別占用不同的存儲單元&#xff0c;這種傳遞方式稱為“參數的值傳遞”。在調用結束后&#…