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(是唯一真实实现函数(运行时真正执行)