Извините, если об этом уже спрашивали, но я не смог найти слова для поиска, которые бы дали мне ответ, который я ищу.

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

if funcName="func1":
  func1(p1, p2, p3)
elif funcName="func2":
  func2(p1, p2, p3)
elif funcName="func3":
  func3(p1, p2, p3)
...

Я знаю, что мог бы использовать другую вспомогательную функцию, которая также взяла бы строку funcName и передала бы ее соответствующей функции, но есть ли лучший способ сделать это? То, что мой мозг хочет сделать, это:

funcName(p1, p2, p3)

Таким образом, я могу вызвать произвольное имя функции, если захочу. Возможно ли что-то подобное?

3
lucas755 14 Дек 2015 в 21:34

3 ответа

Лучший ответ

Да, вы можете, используя dict сопоставление имен с функциями:

funcs = dict(
    func1=func1,
    func2=func2,
    func3=func3
)

funcs[funcName](p1, p2, p3)
7
GingerPlusPlus 14 Дек 2015 в 18:37

Вы можете позвонить им в рамках locals или globals запроса:

locals()[funcName](p1, p2, p3)

Примере:

>>> a = lambda x: x+1
>>> locals()['a'](2)
3

Как указано ниже, вы можете проверить, находятся ли они в пределах ожидаемого:

if funcName in ["func1", "func2", "func3"]:
    locals()[funcName](p1, p2, p3)
1
Netwave 14 Дек 2015 в 18:47

Если вы поместите функции внутри объекта следующим образом:

var funcs = 
{
    f1: function() {},
    f2: function() {},
    f3: function() {}
}

Вы можете сделать funcs['f1']() например.

1
Piwwoli 14 Дек 2015 в 18:37