python - 如何将默认参数与multipledispatch一起使用?
问题描述
我正在使用默认参数重载函数multipledispatch
(基于this answer)
from multipledispatch import dispatch
class TestExampleTest(AbstractTest):
@dispatch(ClassOne, bool, bool)
def function(self, my_class, a=True, b=True):
do_something()
@dispatch(ClassTwo, bool)
def function(self, my_class, a=True):
do_something_else()
当我在function()
没有将值传递给bool
item/s的情况下调用 a
self.function(ClassOne())
我明白了
NotImplementedError:找不到函数的签名
完整的堆栈跟踪:
ExampleTest.py:27 (TestExampleTest.test_example_test)
self = <ExampleTest.TestExampleTest object at 0x04326BB0>
def test_example_test(self):
> self.function(ClassOne())
ExampleTest.py:29:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <dispatched function>
args = (<ExampleTest.ClassOne object at 0x043262B0>,), kwargs = {}
types = (<class 'ExampleTest.ClassOne'>,), func = None
def __call__(self, *args, **kwargs):
types = tuple([type(arg) for arg in args])
func = self.dispatch(*types)
if not func:
raise NotImplementedError('Could not find signature for %s: <%s>' %
> (self.name, str_signature(types)))
E NotImplementedError: Could not find signature for function: <ClassOne>
..\..\..\..\Automation\lib\site-packages\multipledispatch\dispatcher.py:434: NotImplementedError
注意:我知道我可以@dispatch
一起放下并做类似的事情
def function(self, my_class_one=None, my_class_two=None, a=True, b=True):
if my_class_one:
do_something()
elif my_class_two:
do_something_else()
但我想知道我是否可以保留当前的结构。
我该如何解决?
解决方案
默认参数应该在@dispatch 中声明为关键字参数,然后如果要在调用这些函数时修改具有默认值的参数值,请记住传递关键字而不是依赖位置。
from multipledispatch import dispatch
class TestExampleTest(AbstractTest):
@dispatch(ClassOne, a=bool, b=bool)
def function(self, my_class, a=True, b=True): # 1st function
do_something()
@dispatch(ClassTwo, a=bool)
def function(self, my_class, a=True): # 2nd function
do_something_else()
test_ins = TestExampleTest()
# call 1st function
test_ins.function(class_one_ins)
test_ins.function(class_one_ins, a=False)
test_ins.function(class_one_ins, a=False, b=False)
# call 2nd function
test_ins.function(class_two_ins)
test_ins.function(class_two_ins, a=False)
推荐阅读
- react-admin - 如何在 React-Admin 中对列表进行部分应用程序缓存更新?
- indexing - 向量化三维微分;寻找零梯度
- javascript - Expo 应用程序图标未正确显示
- ember.js - 在 Octane 中向 LinkTo 添加额外操作
- c - stat(2) 线程安全吗?
- html - facebook的分享链接不显示我的网址
- android - IllegalArgumentException 访问画廊视频 URI
- c# - Akavache 和 collectionChanged 事件
- ios - 将角度归一化到 0 到 360 度的范围?
- asp.net - 在构建期间获取“警告 MSB3277:发现不同版本之间的冲突”