Python - Есть ли способ сохранить функцию в списке или словаре, чтобы при вызове индекса (или ключа) он запускал сохраненную функцию?
Например, я пробовал такие вещи, как mydict = {'funcList1': [foo(),bar(),goo()], 'funcList2': [foo(),goo(),bar()]
, который не работает.
Есть ли какая-то структура с такой функциональностью?
Я понимаю, что я мог бы сделать это так же легко с кучей инструкций def:
def func1():
foo()
bar()
goo()
Но число запросов, которые мне нужны, становится довольно громоздким и трудно запоминающимся. Было бы неплохо красиво обернуть их в словаре, чтобы я мог время от времени проверять ключи.
Ответы
Ответ 1
Функции являются объектами первого класса в Python и поэтому вы можете отправлять с помощью словаря. Например, если foo
и bar
являются функциями, а dispatcher
- это словарь.
dispatcher = {'foo': foo, 'bar': bar}
Обратите внимание, что значения foo
и bar
, которые являются объектами функции, и NOT foo()
и bar()
.
Чтобы вызвать foo
, вы можете просто сделать dispatcher['foo']()
EDIT: Если вы хотите запустить несколько функций, хранящихся в списке, вы можете сделать что-то вроде этого.
dispatcher = {'foobar': [foo, bar], 'bazcat': [baz, cat]}
def fire_all(func_list):
for f in func_list:
f()
fire_all(dispatcher['foobar'])
Ответ 2
Вы также можете сделать следующее:
Пусть foo1()
, foo2()
, foo3()
,... be функции
Определите foo
следующим образом:
foo = lambda n: eval("foo"+str(n))
Теперь вы можете проходить через них.
for i in range(n):
foo(i)()
n - число функций foo
, определенных.
Этот способ пригодится, если вы не хотите всегда добавлять новые функции типа foo
в список.
Edit:
Важно!!
Пожалуйста, посмотрите это.