假設人們有幾個單獨的函數來評估某些給定的數據。而不是使用冗餘的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