nev*_*int 4 python dispatch-table
我试图通过以下方式构建调度:
def run_nn(type=None):
print type, 'nn'
return
def run_svm(type=None):
print type, 'svm'
return
action = {'nn' : run_nn( type=None),
'svm' : run_svm(type=None),}
Run Code Online (Sandbox Code Playgroud)
我希望函数只有在调用时才会执行:
action.get('nn',type='foo')
Run Code Online (Sandbox Code Playgroud)
期望它打印:
foo nn
Run Code Online (Sandbox Code Playgroud)
但它打破了给予:
TypeError: get() takes no keyword arguments
Run Code Online (Sandbox Code Playgroud)
什么是正确的方法呢?
此外,两个功能run_nn(),run_svm()甚至没有被调用执行.我不希望这样.我怎么能避免呢?
你在构建字典时调用这些函数.您应该将函数对象放在dict中而不调用它们.然后,get来自dict的相应函数并使用关键字参数调用它.
你想要的是:
action = {'nn' : run_nn,
'svm' : run_svm,}
...
action.get('nn')(type='foo') # get function object from dict and then call it.
Run Code Online (Sandbox Code Playgroud)
我建议你使用action['nn'],action.get('nn')因为你没有在方法中指定任何默认的可调用对象get ; 如果不指定get方法,则返回该方法None.在这种情况下,A KeyError比TypeError NoneType对象不可调用更直观.
另一方面,您可以删除这些return语句,因为您实际上没有返回任何内容.没有它们,你的功能仍会返回.
顺便说一下,我觉得你的功能想要改变行为取决于type(虽然你type的反直觉,因为它总是一个字符串).无论如何,你可以看看functools.singledispatch.这会将您的函数转换为单调度泛型函数,并可以创建多个重载实现.
最后,虽然type确实有一个好的参数名称,但是当你需要type在函数中使用内置函数时,你会遇到问题.