2016-11-07 4 views
3

Я пытаюсь построить диспетчерский следующим образом:Как передать параметры в таблице Python диспетчерское

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() были выполнены, даже не будучи вызванными. Я не хочу этого. Как я могу избежать этого?

ответ

5

Вы вызываете функции при построении словаря. Вместо этого вы должны помещать объекты функции в 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, когда вы его не укажете. A KeyError гораздо более интуитивно понятен, чем TypeErrorОбъект NoneType не может быть вызван в этом сценарии.

С другой стороны, вы можете отказаться от этих операторов return, поскольку вы ничего не возвращаете. Ваша функция будет return без них.

BTW, у меня есть чувство, что ваши функции меняют поведение в зависимости от type (хотя ваш type противоречит интуиции, так как это всегда строка). В любом случае, вы можете взглянуть на functools.singledispatch. Это превратит ваши функции в single-dispatch generic function с возможностью создания нескольких перегруженных реализаций.

И, наконец, хотя type действительно подходит для хорошего имени аргумента, вы столкнулись с проблемами, когда вам нужно использовать встроенную функцию type в вашей функции.

Смежные вопросы