Python:关于使用单一调度函数的官方指南

Python: official guidance on using single dispatch functions

我刚刚从 functools 了解到 @singledispatch 运算符。我的第一个想法是,我现在 无处不在 ,因为我经常编写这样的函数。但是,我已经使用 Python 几年了,以前从未遇到过这种情况,这很可怕。

为什么其他人不到处使用它?是否有我不知何故遗漏的昂贵权衡?

关于何时使用或不使用@singledispatch 是否有某种官方指导?

singledispatch 装饰器只是实现多态性的几种方法之一,虽然它通过多方法广泛用于 Clojure 等语言,但恰好在 Python 领域并不常见。

在面向 OOP 的语言中,您通常会看到在 class 级别应用多态性,其中一个对象定义一个方法,并且它的派生子类调整它的行为。这又是一种隐含在对象的 class 类型中的 singledispatch 形式,即根据 self 参数而不是实际的方法输入参数来调度实现。

另一种应用多态性的流行方法是我称之为“鸭子多态性”的方法。为了解决这个问题,一个例子是列表和字典的 pop 方法。在此示例中,两个对象都在抽象行为级别实现了 same 方法,这些方法将内容删除到集合中,它们共享核心思想但实现不同并且没有 class 他们之间的等级制度。在某种意义上它们类似于接口,但在不太严格的意义上,你像鸭子一样嘎嘎叫,所以我可以像对待你一样对待你而不会破坏代码。

总而言之,似乎更多地使用其他方法来实现相同的行为,最终这完全取决于开发人员喜欢如何构建他们的代码。

回到其他问题,我(天真地)不会说使用装饰器会带来巨大的性能损失,尽管与直接调用一个函数相比,肯定会涉及更多的查找和函数调用。

关于官方建议,最好阅读 PEP 443。您将在其中找到有关将其添加到该语言的原因的历史概述。


编辑:Miyagui 所做的一些重要更正。

  1. 字典没有追加方法。
  2. 类文件对象实际上是class 基础对象的子对象。
  3. Print 不分派参数类型,而是调用参数的 strrepr 方法。实际上,PEP 中的 singledispatch 示例是 pprint.pprint,而不是 print.