编辑:我在看内置zip()函数的类型注释。
我理解重载(在类型检查的上下文中)可以根据给定的参数类型来修改函数的行为。
@overload
def zip(__iter1: Iterable[_T1]) -> List[Tuple[_T1]]: ...
@overload
def zip(__iter1: Iterable[_T1],
__iter2: Iterable[_T2]) -> List[Tuple[_T1, _T2]]: ...
@overload
def zip(__iter1: Iterable[_T1], __iter2: Iterable[_T2],
__iter3: Iterable[_T3]) -> List[Tuple[_T1, _T2, _T3]]: ...
@overload
def zip(__iter1: Iterable[_T1], __iter2: Iterable[_T2], __iter3: Iterable[_T3],
__iter4: Iterable[_T4]) -> List[Tuple[_T1, _T2, _T3, _T4]]: ...
@overload
def zip(__iter1: Iterable[_T1], __iter2: Iterable[_T2], __iter3: Iterable[_T3],
__iter4: Iterable[_T4], __iter5: Iterable[_T5]) -> List[Tuple[_T1, _T2, _T3, _T4, _T5]]: ...
@overload
def zip(__iter1: Iterable[Any], __iter2: Iterable[Any], __iter3: Iterable[Any],
__iter4: Iterable[Any], __iter5: Iterable[Any], __iter6: Iterable[Any],
*iterables: Iterable[Any]) -> List[Tuple[Any, ...]]: ...但是,在本例中,
@overload
def zip(__iter1: Iterable[Any], __iter2: Iterable[Any], __iter3: Iterable[Any],
__iter4: Iterable[Any], __iter5: Iterable[Any], __iter6: Iterable[Any],
*iterables: Iterable[Any]) -> List[Tuple[Any, ...]]: ...发布于 2020-11-22 06:37:35
overload装饰器用于静态类型分析,而不是用于实现。实际上,问题中显示的代码只是类型注释-- zip是内置的,不是用Python实现的。
各种重载的目的是保留参数的数量和类型。例如,它声明三个可迭代项上的zip生成元组,其中三个元素与可迭代元素的类型相匹配。变量*args和Any的最终重载只是对未指定情况的一次捕获。
发布于 2020-11-22 06:22:14
这是个优化。可以处理任意数量参数的版本需要使用额外的循环级别。固定数量的参数的版本可以对每个参数进行硬编码访问,这样效率更高。
zip()的绝大部分使用只有2-3个参数,所以即使这个优化可能很小,它也是非常有益的。
https://stackoverflow.com/questions/64951212
复制相似问题