如何在Python Dispatch Table

时间:2016-11-07 01:07:55

标签: 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),}

我希望在使用类似的方式调用时执行

 action.get('nn',type='foo')

期待它打印:

foo nn

但它打破了给予:

TypeError: get() takes no keyword arguments

做正确的方法是什么?

此外,执行了两个函数run_nn()run_svm(),甚至没有被调用。我不想要那个。我怎么能避免它?

1 个答案:

答案 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。在这种情况下,KeyErrorTypeError NoneType对象不可调用更直观。

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

顺便说一下,我觉得你的功能想要改变行为取决于type(尽管你的type反直觉,因为它总是一个字符串)。无论如何,您可以查看functools.singledispatch。这会将您的函数转换为single-dispatch generic function,可以创建多个重载实现。

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