更加优雅的类型检查与传参---mcp源码分析

复制代码
def run(self, transport= "stdio", **kwargs):
    ...

我们如果要实现一个函数适配多个不同的入口,传统方法就是这样子做,定义一个入口函数,设置动态传入参数。

但这种方法简直是灾难,

1.不管选哪个 transport,都会一次性弹出 host、port、sse_path、json_response 等全部几十种参数,分不清哪个参数属于哪种传输方式,极易传错。

2.某个模式根本不需要其他参数,但类型检查器不会报错,运行时多余参数丢进 kwargs,底层函数不识别就会静默异常,调试极难。

如果想要更加优雅的类型检查与传参,python还提供了另外一种方式给我们使用,

复制代码
@overload
def run(self, transport: Literal["stdio"] = ...) -> None: ...

@overload
def run(
    self,
    transport: Literal["sse"],
    *,
    host: str = ...,
    port: int = ...,
    ...
) -> None: ...

def run(
    self,
    transport: Literal["stdio", "sse", "streamable-http"] = "stdio",
    **kwargs: Any,
) -> None:
    # 路由分发逻辑

重载 1:transport="stdio"

  • 只能传 transport="stdio"不允许额外关键字参数(host/port 等都不能传)
  • IDE 调用 server.run() 时不会弹出 host、port 等多余参数,类型检查器多传参数直接标红报错。

重载 2:transport="sse"

  • 必须显式指定 transport="sse"
  • *, 强制后续所有参数只能用关键字传参,不能位置传参;
  • 限定只能传入 SSE 专属配置:host、port、sse_path、证书配置等,其它无关参数静态报错。

def run(是唯一真实实现函数(运行时真正执行)

相关推荐
小羊没烦恼!8 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里8 小时前
java中的继承和多态的区别
java
小羊没烦恼!8 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕8 小时前
JSONObject与JSONArray封装数据格式区别
java·json
虎头金猫8 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
胡写代码8 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖8 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时9 小时前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读9 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
vipxieliang9 小时前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot