5

我想在 Python 中使用重载。我知道这是不可能的设计(Python 是动态类型语言),关于这个主题有相当好的线程。这就是为什么我可以使用多重调度(多方法)之类的东西。我正在考虑最好的解决方案,它可以为任何函数或类方法实现多次分派。是否有任何解决方案本身包含在 Python 中?

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

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

到目前为止,我能够找到这两个库(未包含在 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):
    ...

这个功能看起来很相似。

我主要有两个问题:

  • 这些多个调度实现中的一个是否会比另一个带来任何(不利)优势?(例如支持的类型、速度、性能、限制……)它似乎具有可比性,但我不确定这一点,因为后者(multipledispatch)似乎更受欢迎(检查 GitHub 星星)但维护较少(我什至会说不太成熟)。
  • 是否有任何其他解决方案(即使包含在 Python 标准库中)?
4

1 回答 1

1

我为什么多方法比多调度好得多的原因

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