为可变参数(args/kwargs)重载类型标注,实现精准类型推断
解决Python函数多场景返回值的精准类型推断问题
你当前的test函数用Union作为返回类型,导致类型检查器无法区分不同调用场景的返回值类型。要实现精准推断,完全可以通过typing.overload为不同调用情况单独定义类型签名。
修改后的代码如下:
from typing import overload, Union, Tuple # 定义三种调用场景的重载签名 @overload def test(*args: int) -> int: ... @overload def test(**kwargs: str) -> str: ... @overload def test() -> Tuple[int]: ... # 函数实际实现 def test(*args: int, **kwargs: str) -> Union[int, str, Tuple[int]]: if args: return 5 if kwargs: return "5" return (5,) # 现在类型检查器能正确识别各变量类型 k = test(1) j = test(i="1") i = test() reveal_type(k) # 正确识别为int reveal_type(j) # 正确识别为str reveal_type(i) # 正确识别为Tuple[int]
说明:
@overload用来给类型检查器提供不同调用场景的类型约定,重载的函数体只用...占位即可,无需编写实际逻辑。- 三个重载分别对应三种调用情况:传入至少一个位置参数、传入至少一个关键字参数、无参数传入,每种情况都指定了明确的返回类型。
- 实际的函数实现保留原有逻辑,返回类型用
Union覆盖所有可能的返回值,类型检查器会根据调用时的参数匹配对应的重载签名,从而精准推断返回类型。
内容的提问来源于stack exchange,提问作者FamousSnake
相关产品推荐
相关产品推荐

