4

我正在尝试通过以下方式构建调度:

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()甚至在没有被调用的情况下就被执行了。我不想要那个。我怎样才能避免它?

4

1 回答 1

8

您在构建字典时调用这些函数。您应该将函数对象放在 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']over,action.get('nn')因为您没有在方法中指定任何默认可调用get;该get方法None在您未指定时返回。A比在这种情况下不可调用KeyError的 NoneType 对象更直观。TypeError

另一方面,您可以删除这些return语句,因为您实际上并没有返回任何内容。没有它们,您的函数仍将返回。

顺便说一句,我感觉你的函数想要改变行为取决于type(虽然你type是违反直觉的,因为它总是一个字符串)。无论如何,你可以看看functools.singledispatch. 这会将您的函数转换为单调度通用函数,并有可能创建多个重载实现。

最后,虽然type确实是一个好的参数名称,但当您需要在函数中使用内置函数时,您会遇到问题type

于 2016-11-07T01:11:13.983 回答