You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改重载函数签名,使类型检查器忽略无关参数无需频繁更新重载

问题描述

现有如下Python代码(mypy与pyright均未报错):

from typing import Literal, overload

@overload
def test(switch: Literal[True]) -> int: ...
@overload
def test(switch: Literal[False]) -> None: ...

def test(switch: bool) -> int | None:
    return 123 if switch is True else None

test_int: int = test(True)
test_none: None = test(False)

现在需要为该函数添加大量与返回类型无关的参数,修改后的函数如下:

def test(switch: bool, var1: str, var2: float, var3: int) -> int | None:
    return 123 if switch is True else None

需要修改重载函数的签名,让类型检查器仅识别switch参数为返回类型的决定因素,忽略其余所有参数,且无需在添加新参数时频繁更新重载。此前尝试结合*args、**kwargs与Any实现,但未成功。

解决方案

可以利用Python类型注解中的强制位置参数分隔符*,结合*args: Any和**kwargs: Any来固定重载对switch参数的检查,同时兼容任意后续参数。具体实现如下:

from typing import Literal, overload, Any

@overload
def test(switch: Literal[True], *args: Any, **kwargs: Any) -> int: ...
@overload
def test(switch: Literal[False], *args: Any, **kwargs: Any) -> None: ...

def test(switch: bool, var1: str, var2: float, var3: int) -> int | None:
    return 123 if switch is True else None

# 类型检查正常通过
test_int: int = test(True, "abc", 1.5, 42)
test_none: None = test(False, "def", 2.7, 100)

# 后续新增参数时,无需修改重载
def test(switch: bool, var1: str, var2: float, var3: int, var4: list[str]) -> int | None:
    return 123 if switch is True else None

# 类型检查依然正常
test_int2: int = test(True, "abc", 1.5, 42, ["x", "y"])

核心逻辑

  • *args: Any 匹配任意数量的后续位置参数,**kwargs: Any 匹配任意数量的关键字参数,两者结合覆盖了所有可能的额外参数类型
  • 重载签名仅关注switch的字面量类型,后续新增参数时无需修改重载定义
  • 类型检查器会根据switch的取值推断返回类型,同时验证实际传入的参数是否符合实现函数的签名要求

内容的提问来源于stack exchange,提问作者johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:21:06