Есть ли способ сохранить функцию в списке или словаре, чтобы при вызове индекса (или ключа) она сохраняла сохраненную функцию? - PullRequest
46 голосов
/ 09 февраля 2012

Например, я пробовал что-то вроде mydict = {'funcList1': [foo(),bar(),goo()], 'funcList2': [foo(),goo(),bar()], что не работает.

Есть ли какая-то структура с такой функциональностью?

Я понимаю, что, очевидно, я мог бы сделать это так же легко с помощью множества def утверждений:

def func1():
    foo()
    bar()
    goo()

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

1 Ответ

111 голосов
/ 09 февраля 2012

Функции - это объекты первого класса в Python, поэтому вы можете отправлять их, используя словарь. Например, если foo и bar - функции, а dispatcher - словарь, подобный этому.

dispatcher = {'foo': foo, 'bar': bar}

Обратите внимание, что значения foo и bar являются объектами функций, а НЕ foo() и bar().

Чтобы позвонить foo, вы можете просто набрать dispatcher['foo']()

РЕДАКТИРОВАТЬ: Если вы хотите запустить несколько функций, хранящихся в списке, вы можете сделать что-то вроде этого.

dispatcher = {'foobar': [foo, bar], 'bazcat': [baz, cat]}

def fire_all(func_list):
    for f in func_list:
        f()

fire_all(dispatcher['foobar'])
...