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

1 ответ

Решение

Вы вызываете функции при создании словаря. Вместо этого вы должны поместить объекты функций в 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, Это преобразует ваши функции в универсальную функцию с одной отправкой с возможностью создания нескольких перегруженных реализаций.

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

Другие вопросы по тегам