Есть ли способ сохранить функцию в списке или словаре, чтобы при вызове индекса (или ключа) она запускала сохраненную функцию?

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

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

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

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

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


person Zack    schedule 09.02.2012    source источник
comment
Вы описали функциональное программирование, не осознавая этого: P   -  person Dominic Bou-Samra    schedule 09.02.2012


Ответы (1)


Функции - это объекты первого класса в 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'])
person Praveen Gollakota    schedule 09.02.2012
comment
Аккуратный! Могу ли я сохранить в значении несколько функций? Итак, когда я вызываю ключ [foo](), он запускает все функции, хранящиеся в значении? - person Zack; 09.02.2012
comment
@Zack Добавлены подробности о нескольких функциях в списке - person Praveen Gollakota; 09.02.2012
comment
аккуратно и чисто, хорошо объяснено - person Muyide Ibukun; 30.03.2017
comment
Как бы это работало, если бы методы были частью класса? Итак, если функция была `` def func1 (self) '' и когда мы вызываем ее, она должна быть self.func1, как мы могли бы сделать так, чтобы диспетчер диктовал? - person DUDANF; 16.09.2019
comment
Просто передайте метод в словарь - person coderoftheday; 11.10.2020
comment
@PraveenGollakota Есть ли способ сохранить аргументы функции в словаре? Кажется, я не могу понять, как заставить это работать. - person Anthony; 04.11.2020