15

我制作了一个 Python 脚本,它根据用户的输入调用函数。到目前为止,我只是通过 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,但它也不起作用。

4

4 回答 4

26

None仍然是一个值,并且将其传递给不期望参数的函数将不起作用。而是考虑partial在这里使用

from functools import partial

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

options[choice]()
于 2012-08-05T11:46:06.393 回答
18

使用参数列表:

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)
于 2012-08-05T11:45:08.290 回答
4

您可以对带有参数的函数使用 lambda 表达式(并保留那些没有参数的函数):

options = { 0 : func0,
            1 : func1,
            2 : lambda: func2(foo1),
            3 : lambda: func3(foo2),
          }
于 2012-08-05T11:49:04.170 回答
1

尝试这样的事情:

在函数头中使用*,它将收集元组中的所有参数。

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,)]
于 2012-08-05T11:51:15.853 回答