Передача аргументов при вызове функции через dict

Я создал Python script, который вызывает функции, основанные на пользовательском вводе. До сих пор я вызывал без аргументов функции просто через dict

options = { 0 : func0,
            1 : func1,
            2 : func2,
           }
options[choice]()

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

options = { 0 : (func0,None),
            1 : (func1,None),
            2 : (func2,foo1),
            3 : (func3,foo2),
          }
options[choice][0](options[choice][1])

Я знаю, почему None здесь не работает и написал это просто для обозначения того, что функция не принимает никаких аргументов. Какие изменения следует внести в код, чтобы он работал для всех видов функций?

Я попробовал распаковать empty dict, но он тоже не работает.

Ответы

Ответ 1

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

from functools import partial

options = { 0: func0,
            1: func1,
            2: partial(func2, foo1),
            3: partial(func3, foo2),
          }

options[choice]()

Ответ 2

Используйте списки аргументов:

options = { 0 : (func0, []),
            1 : (func1, []),
            2 : (func2, [foo1]),
            3 : (func3, [foo2]),
          }
options[choice][0](*options[choice][1])
# or
func, args = options[choice]
func(*args)

Если вы хотите также указать именованные аргументы, вы можете расширить его следующим образом:

options = { 0 : (func0, [], {}),
            1 : (func1, [], {param_name: value}),
            2 : (print_name, [], {name: "nims"}),
            3 : (func3, [foo2], {}),
          }
func, args, kwargs = options[choice]
func(*args, **kwargs)

Ответ 3

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

options = { 0 : func0,
            1 : func1,
            2 : lambda: func2(foo1),
            3 : lambda: func3(foo2),
          }

Ответ 4

попробуйте что-то вроде этого:

используйте * в заголовке функции, он соберет все аргументы в кортеже.

def func0(*a):
    print list(a)
def func1(*a):
    print list(a)
def func2(*a):
    print list(a)
def func3(*a):
    print list(a)
foo1=1
foo2=2
options = { 0 : (func0,None),
            1 : (func1,None),
            2 : (func2,foo1),
            3 : (func3,foo2),
          }
choice=2
options[choice][0](options[choice][1:])  #prints [(1,)]

choice=1
options[choice][0](options[choice][1:])  #prints [(None,)]