multimethod 和 multipledispatch 之间有什么区别吗?

Is there any difference between multimethod and multipledispatch?

我想在 Python 中使用重载。我知道这在设计上是不可能的(Python 是动态类型语言),关于这个主题有相当不错的话题 here。这就是为什么我可以使用诸如多重分派(multimethods)之类的东西。我正在考虑最好的解决方案,即为任何函数或 class 方法实施多重分派。 Python中是否有任何原生包含的解决方案?

使用singledispatch(添加到3.4中的Python)在我的情况下是不够的(因为只考虑第一个参数的类型,我需要multiple) .

我也知道我可以使用关键字参数(即具有单一功能并通过检查所有参数来驱动行为),但是当你有很多参数和组合时它会变得复杂。

到目前为止,我能够找到这两个库(未包含在 Python 标准库中):

基本用法如下:

from multimethod import multimethod

@multimethod
def add(x: int, y: int):
    ...

@multimethod
def add(x: str, y: str):
    ...

from multipledispatch import dispatch

@dispatch(int, int)
def add(x, y):
    ...

@dispatch(str, str)
def add(x, y):
    ...

这个功能看起来非常相似。

我主要有两个问题:

为什么 multimethod 比 multipledispatch 好得多的原因

  1. 我们添加到方法签名中的类型信息,而不是装饰器签名中。这样做更加直观和简洁。
  2. 多方法的类型提示与 static type support/mypy 预期的相同。现在,类型注释在开发人员中变得普遍。所以,这对双方都有帮助! Multimethod 类型提示与 mypy 类型提示正式相同
  3. 请注意,无论是 multi method 还是 multiple dispatch,似乎都只支持非关键字函数调用。如果您在调用时使用关键字调用函数,则两者都会失败。这令人失望,但他们可能有更多理由这样做。请阅读各个模块的指南。他们谈论基于关键字的函数调用,但不是很清楚,IMO。因此,有时我觉得,在我们的函数中进行简单的类型检查可以一次性解决所有问题,而不是使用多方法或多重分派。毕竟,我想要第一个 class 解决方案,因为函数是第一个 class 个对象。
  4. 据我所知,Polymorphism/function 重载的语言没有解决方案。但是多方法看起来像 Pythonic 和原生的。我只是喜欢它。此外,multimethod 还支持单一调度,虽然我从来没有觉得需要它。
  5. 感谢您的提问。你已经回答了。在阅读您的问题之前,我没有意识到确切的区别。你已经提供了答案。谢谢你的问题。