假设人们有几个单独的函数来评估某些给定的数据。而不是使用冗余的if/else循环,决定使用字典键来查找特定的函数及其相应的参数。我觉得这是可能的,但我无法弄清楚如何使这项工作。作为一个简单的例子(我希望能为我的情况调整),考虑下面的代码:是否有可能适应这种使用字典来查找/评估众多函数之一及其相应参数的方法?
def func_one(x, a, b, c=0):
""" arbitrary function """
# c is initialized since it is necessary in func_two and has no effect in func_one
return a*x + b
def func_two(x, a, b, c):
""" arbitrary function """
return a*x**2 + b*x + c
def pick_function(key, x=5):
""" picks and evaluates arbitrary function by key """
if key != (1 or 2):
raise ValueError("key = 1 or 2")
## args = a, b, c
args_one = (1, 2, 3)
args_two = (4, 5, 3)
## function dictionary
func_dict = dict(zip([1, 2], [func_one, func_two]))
## args dictionary
args_dict = dict(zip([1, 2], [args_one, args_two]))
## apply function to args
func = func_dict[key]
args = args_dict[key]
## my original attempt >> return func(x, args)
return func(x, *args) ## << EDITED SOLUTION VIA COMMENTS BELOW
print(func_one(x=5, a=1, b=2, c=3)) # prints 7
但是,
print(pick_function(1))
返回一条错误消息
File "stack_overflow_example_question.py", line 17, in pick_function
return func(x, args)
TypeError: func_one() missing 1 required positional argument: 'b'
显然,不所有的args
正在通过字典。我尝试过从args_one
和args_two
(如pick_function
中定义的)添加/删除额外括号和假名的各种组合。这种方法成果丰硕吗?有没有其他方便(在可读性和速度方面)的方法,不需要很多if/else循环?
尝试将其更改为:**返回func(x,* args)**(*等于开箱变量) –
您是否想要放置一个摔跤运算符?它已经以你评论的形式出现了。 – mikey