multimethod 和 multipledispatch 之间有什么区别吗?
Is there any difference between multimethod and multipledispatch?
我想在 Python 中使用重载。我知道这在设计上是不可能的(Python 是动态类型语言),关于这个主题有相当不错的话题 here。这就是为什么我可以使用诸如多重分派(multimethods)之类的东西。我正在考虑最好的解决方案,即为任何函数或 class 方法实施多重分派。 Python中是否有任何原生包含的解决方案?
使用singledispatch(添加到3.4中的Python)在我的情况下是不够的(因为只考虑第一个参数的类型,我需要multiple) .
我也知道我可以使用关键字参数(即具有单一功能并通过检查所有参数来驱动行为),但是当你有很多参数和组合时它会变得复杂。
到目前为止,我能够找到这两个库(未包含在 Python 标准库中):
- multimethod - provides a decorator for adding multiple argument dispatching to functions, one can use the same style of registration as functools.singledispatch,与注释配合使用效果很好,甚至可以与带注释的谓词配合使用,或者为 classes
提供特殊的 multimeta
命名空间
- multipledispatch - 还提供了用于多参数调度的装饰器,不适用于注释,与以前的库相比,对我来说看起来没那么强大
基本用法如下:
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 标准库中的解决方案)?
为什么 multimethod 比 multipledispatch 好得多的原因
- 我们添加到方法签名中的类型信息,而不是装饰器签名中。这样做更加直观和简洁。
- 多方法的类型提示与 static type support/mypy 预期的相同。现在,类型注释在开发人员中变得普遍。所以,这对双方都有帮助! Multimethod 类型提示与 mypy 类型提示正式相同
- 请注意,无论是 multi method 还是 multiple dispatch,似乎都只支持非关键字函数调用。如果您在调用时使用关键字调用函数,则两者都会失败。这令人失望,但他们可能有更多理由这样做。请阅读各个模块的指南。他们谈论基于关键字的函数调用,但不是很清楚,IMO。因此,有时我觉得,在我们的函数中进行简单的类型检查可以一次性解决所有问题,而不是使用多方法或多重分派。毕竟,我想要第一个 class 解决方案,因为函数是第一个 class 个对象。
- 据我所知,Polymorphism/function 重载的语言没有解决方案。但是多方法看起来像 Pythonic 和原生的。我只是喜欢它。此外,multimethod 还支持单一调度,虽然我从来没有觉得需要它。
- 感谢您的提问。你已经回答了。在阅读您的问题之前,我没有意识到确切的区别。你已经提供了答案。谢谢你的问题。
我想在 Python 中使用重载。我知道这在设计上是不可能的(Python 是动态类型语言),关于这个主题有相当不错的话题 here。这就是为什么我可以使用诸如多重分派(multimethods)之类的东西。我正在考虑最好的解决方案,即为任何函数或 class 方法实施多重分派。 Python中是否有任何原生包含的解决方案?
使用singledispatch(添加到3.4中的Python)在我的情况下是不够的(因为只考虑第一个参数的类型,我需要multiple) .
我也知道我可以使用关键字参数(即具有单一功能并通过检查所有参数来驱动行为),但是当你有很多参数和组合时它会变得复杂。
到目前为止,我能够找到这两个库(未包含在 Python 标准库中):
- multimethod - provides a decorator for adding multiple argument dispatching to functions, one can use the same style of registration as functools.singledispatch,与注释配合使用效果很好,甚至可以与带注释的谓词配合使用,或者为 classes 提供特殊的
- multipledispatch - 还提供了用于多参数调度的装饰器,不适用于注释,与以前的库相比,对我来说看起来没那么强大
multimeta
命名空间
基本用法如下:
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 标准库中的解决方案)?
为什么 multimethod 比 multipledispatch 好得多的原因
- 我们添加到方法签名中的类型信息,而不是装饰器签名中。这样做更加直观和简洁。
- 多方法的类型提示与 static type support/mypy 预期的相同。现在,类型注释在开发人员中变得普遍。所以,这对双方都有帮助! Multimethod 类型提示与 mypy 类型提示正式相同
- 请注意,无论是 multi method 还是 multiple dispatch,似乎都只支持非关键字函数调用。如果您在调用时使用关键字调用函数,则两者都会失败。这令人失望,但他们可能有更多理由这样做。请阅读各个模块的指南。他们谈论基于关键字的函数调用,但不是很清楚,IMO。因此,有时我觉得,在我们的函数中进行简单的类型检查可以一次性解决所有问题,而不是使用多方法或多重分派。毕竟,我想要第一个 class 解决方案,因为函数是第一个 class 个对象。
- 据我所知,Polymorphism/function 重载的语言没有解决方案。但是多方法看起来像 Pythonic 和原生的。我只是喜欢它。此外,multimethod 还支持单一调度,虽然我从来没有觉得需要它。
- 感谢您的提问。你已经回答了。在阅读您的问题之前,我没有意识到确切的区别。你已经提供了答案。谢谢你的问题。