我正在尝试按以下方式构建调度:
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),}
我希望在使用类似的方式调用时执行 。
action.get('nn',type='foo')
期待它打印:
foo nn
但它打破了给予:
TypeError: get() takes no keyword arguments
做正确的方法是什么?
此外,执行了两个函数run_nn()
和run_svm()
,甚至没有被调用。我不想要那个。我怎么能避免它?
答案 0 :(得分:7)
您在构建字典时调用这些函数。您应该将函数对象放在dict中而不调用它们。然后,get
来自dict的相应函数,并使用关键字参数调用它。
你想要的是:
action = {'nn' : run_nn,
'svm' : run_svm,}
...
action.get('nn')(type='foo') # get function object from dict and then call it.
我建议您使用action['nn']
而不是action.get('nn')
,因为您未在get
方法中指定任何默认可调用;如果您没有指定,get
方法会返回None
。在这种情况下,KeyError
比TypeError
NoneType对象不可调用更直观。
另一方面,您可以删除那些return
语句,因为您实际上并没有返回任何内容。没有它们,你的功能仍将返回。
type
(尽管你的type
反直觉,因为它总是一个字符串)。无论如何,您可以查看functools.singledispatch
。这会将您的函数转换为single-dispatch generic function,可以创建多个重载实现。
最后,虽然type
确实有一个好的参数名称,但是当你需要在你的函数中使用内置type
时,你会遇到问题。