如何修改重载函数签名,使类型检查器忽略无关参数无需频繁更新重载
问题描述
现有如下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
相关产品推荐
相关产品推荐

