1

我正在使用 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')

当尝试以这种方式使用它时,调度装饰器会忽略 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: <>
4

1 回答 1

2

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

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

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

于 2021-01-14T10:27:38.417 回答