首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:为什么在函数中使用重载而不是*args (特别是当参数类型不影响函数的运行方式时)

Python:为什么在函数中使用重载而不是*args (特别是当参数类型不影响函数的运行方式时)
EN

Stack Overflow用户
提问于 2020-11-22 06:15:06
回答 2查看 162关注 0票数 1

编辑:我在看内置zip()函数的类型注释。

我理解重载(在类型检查的上下文中)可以根据给定的参数类型来修改函数的行为。

代码语言:javascript
复制
    @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, ...]]: ...

但是,在本例中,

  1. 的类型是相同的(任意)。那么重载有什么用途呢?

  1. 为什么不只是使用最后一个函数,它接受任意数量的参数。为什么要创建前五个,本质上说:如果有一个论点,做这个,如果有两个那样做,如果有3个.这似乎违反了干原理。--

代码语言:javascript
复制
    @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, ...]]: ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-22 06:37:35

overload装饰器用于静态类型分析,而不是用于实现。实际上,问题中显示的代码只是类型注释-- zip是内置的,不是用Python实现的。

各种重载的目的是保留参数的数量和类型。例如,它声明三个可迭代项上的zip生成元组,其中三个元素与可迭代元素的类型相匹配。变量*argsAny的最终重载只是对未指定情况的一次捕获。

票数 1
EN

Stack Overflow用户

发布于 2020-11-22 06:22:14

这是个优化。可以处理任意数量参数的版本需要使用额外的循环级别。固定数量的参数的版本可以对每个参数进行硬编码访问,这样效率更高。

zip()的绝大部分使用只有2-3个参数,所以即使这个优化可能很小,它也是非常有益的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64951212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档