python方法重载-使用kwargs进行多次调度

问题描述

我使用 python3.8 和 multipledispatch 库来重载方法签名。

multipledispatch 文档示例建议像这样重载:

from multipledispatch import dispatch


@dispatch(int,int)
def add(x,y):
    print(x + y)


@dispatch(str,str)
def add(x,y):
    print(f'{x} {y}')


add(1,2)
add('hello','world')

但在我的情况下,我想使用关键字参数调用 add ,如下所示:

add(x=1,y=2)
add(x='hello',y='world')

而且我还想将它与这样的认值一起使用:

from multipledispatch import dispatch


@dispatch(int,int)
def add(x=2,y=1):
    print(x + y)


@dispatch(str,str)
def add(x='hello',y='world'):
    print(f'{x} {y}')


add(x=1)
add(y='world')

当尝试以这种方式使用它时,dispatch 装饰器会忽略 kwargs 并抛出以下异常:

Traceback (most recent call last):
  File "/home/tomer/.virtualenvs/sqa/lib/python3.8/site-packages/multipledispatch/dispatcher.py",line 269,in __call__
    func = self._cache[types]
KeyError: ()

During handling of the above exception,another exception occurred:

Traceback (most recent call last):
  File "/home/tomer/windows-automation-testing/sqa/try.py",line 22,in <module>
    add(x=1,y=2)
  File "/home/tomer/.virtualenvs/sqa/lib/python3.8/site-packages/multipledispatch/dispatcher.py",line 273,in __call__
    raise NotImplementedError(
NotImplementedError: Could not find signature for add: <>

解决方法

当您看到 NotImplementedError 通常意味着您需要对其进行子类化并实现它。最常见的情况是你有一些抽象类,它只是一个接口,你需要继承它并实现你需要的方法。

该方法有一个占位符,只需实现它即可。

文档内容:Dispatches on all non-keyword arguments

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...