问题描述
我使用 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