美文网首页Python小哥哥
Python 里的「单分派泛函数」到底是什么?

Python 里的「单分派泛函数」到底是什么?

作者: 我爱学python | 来源:发表于2019-05-30 16:54 被阅读18次

泛型,如果你学过Java ,应该对它不陌生吧。但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数。

在Python中只能实现基于单个(第一个)参数的数据类型来选择具体的实现方式,官方名称 是 single-dispatch。你或许听不懂,说简单点,就是可以实现第一个参数的数据类型不同,其调用的函数也就不同。

singledispatch 是 PEP443 中引入的,如果你对此有兴趣,PEP443 应该是最好的学习文档:

https://www.python.org/dev/peps/pep-0443/

generic function is composed of multiple functions implementing the same operation for different types. Which implementation should be used during a call is determined by the dispatch algorithm. When the implementation is chosen based on the type of a single argument, this is known as single dispatch.

它使用方法极其简单,只要被singledispatch 装饰的函数,就是一个单分派的(single-dispatch )的泛函数(generic functions)。

单分派:根据一个参数的类型,以不同方式执行相同的操作的行为。

多分派:可根据多个参数的类型选择专门的函数的行为。

泛函数:多个函数绑在一起组合成一个泛函数。

这边举个简单的例子,介绍一下使用方法

执行结果

说起泛型,其实在 Python 本身的一些内建函数中并不少见,比如 len() , iter(),copy.copy() ,pprint() 等

你可能会问,它有什么用呢?实际上真没什么用,你不用它或者不认识它也完全不影响你编码。

我这里举个例子,你可以感受一下。

大家都知道,Python 中有许许多的数据类型,比如 str,list, dict, tuple 等,不同数据类型的拼接方式各不相同,所以我这里我写了一个通用的函数,可以根据对应的数据类型对选择对应的拼接方式拼接,而且不同数据类型我还应该提示无法拼接。以下是简单的实现。

输出结果如下

如果不使用singledispatch 的话,你可能会写出这样的代码。

输出如下

以上是我个人的一些理解,如有误解误传,还请你后台留言帮忙指正!

相关文章

  • Python 里的「单分派泛函数」到底是什么?

    泛型,如果你学过Java ,应该对它不陌生吧。但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛...

  • Python 函数如何实现“重载”

    单分派泛函数 假如你想在交互模式下打印出美观的对象,那么标准库中的 pprint.pprint() 函数或许是一个...

  • java方法调用-单分派与多分派

    根据分派基于多少种宗量(方法的接收者与方法的参数统称为方法的宗量),可以将分派划分为单分派和多分派两种。单分派是根...

  • Python decorators

    Python代码里经常看到一个符号@摆在函数的上面一行,这叫decorator,但它到底是什么,表示什么意思,有什...

  • 测试异步函数的方案

    python异步函数需要在事件循环里跑才可以, 因此写单测会非常麻烦.我在python源码里找到了一个简单的方案(...

  • Java 静态多分派&动态单分派

    分派发生在编译期和运行期,编译期的分派为静态分派,运行期的为动态分派。 编译期是根据对象声明的类型来选择方法,运行...

  • Kotlin reified - 关键字

    reified关键字是用于Kotlin内联函数的,修饰内联函数的泛型,泛型被修饰后,在方法体里,能从泛型拿到泛型的...

  • Python单例

    Python单例 一般单例,利用内置函数def __new__(cls, *args, **kwargs)实现单例...

  • java基础知识,字节码执行引擎

    知识要点: 函数解析 静态分派 动态分派 字节码 函数解析 虚拟机方法字节码 在Java语言中符合“编译期可知,运...

  • Swift:泛型

    泛型 泛型函数泛型函数和非泛型函数的不同之处在于:泛型函数名(swapTwoValues(::))后面跟着 占位类...

网友评论

    本文标题:Python 里的「单分派泛函数」到底是什么?

    本文链接:https://www.haomeiwen.com/subject/slivtctx.html