@overload 装饰器实现函数重载

python中实现函数重载

@overload 也是一种类型注解,表明同名方法有多种实现。

例子:

 1from typing import overload, List, Union
 2
 3class MyStrList:
 4    def __init__(self, content: List[str]):
 5        self.content = content
 6
 7    @overload
 8    def __getitem__(self, index: int) -> str:
 9        ...
10
11    @overload
12    def __getitem__(self, s: slice) -> 'MyStrList':
13        ...
14
15    def __getitem__(self, item: Union[int, slice]) -> Union[str, 'MyStrList']:
16        if isinstance(item, int):
17            return self.content[item]
18        elif isinstance(item, slice):
19            return MyStrList(self.content[item])
20        else:
21            raise TypeError("Invalid argument type.")
22
23data = MyStrList(["hello", ",", "world"])
24item = data[0] # 等同于 `MyStrList[0]`
25items = data[1:2] # 等同于 `MyStrList[1:2]`

Note: 被@overload装饰的函数不能直接调用。

真正的函数实现应该是没有@overload装饰的版本,它需要处理所有可能的参数类型和返回类型。