Python 中 @overload 注解可以用来描述一个方法/函数的重载,但是这里的重载和 Java 中 的重载概念不同,在 Python 中仅仅用于描述更具体的类型关系。

假设有以下函数:

def double(input_: int | list[int]) -> int | list[int]:
    if isinstance(input_, list):
        return [i * 2 for i in input_]
    return input_ * 2

从实现我们可以看出函数的返回类型和参数类型是绑定的,不存在输入 int 返回 list 的 情况,但 python 的类型系统无法知道这一点,只能通过 type hint 判断返回类型为 int | list

这时候我们就可以使用 @overload 来描述更具体的类型关系:

@overload
def double(input_: int) -> int:
    ...
 
@overload
def double(input_: list[int]) -> list[int]:
    ...
 
def double(input_: int | list[int]) -> int | list[int]:
    if isinstance(input_, list):
        return [i * 2 for i in input_]
    return input_ * 2

上述代码的前两个 double 函数的实现用 ... 省略,只用于描述函数签名,这时候如果我 们传入的是 int 参数,python 就会知道返回的也是 int 类型。