我制作了一个Python脚本,它根据用户的输入调用函数。到现在为止,我只是通过字典来调用无参数函数
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
,但它也不起作用。
答案 0 :(得分:26)
None
仍然是一个值,并将它传递给一个不期望参数的函数将不起作用。而是考虑在这里使用partial
from functools import partial
options = { 0: func0,
1: func1,
2: partial(func2, foo1),
3: partial(func3, foo2),
}
options[choice]()
答案 1 :(得分: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)
答案 2 :(得分:4)
你可以将lambda表达式用于带参数的函数(并保留没有你现有的函数):
options = { 0 : func0,
1 : func1,
2 : lambda: func2(foo1),
3 : lambda: func3(foo2),
}
答案 3 :(得分: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,)]