我有一個函數模塊,它有一些函數,都有一些常用的輸入,還有一些函數模塊對它們來說是特定的。例如如何在python中使用* args
def func_a(time_series, window ='1D'):
def func_b(time_series, window ='1D', availability_history):
def func_c(time_series, window ='1D', max_lag=25, use_probability ='T'):
我想如下運行在一個循環中這些功能:
func_list = [func_a, func_b, func_c]
windows = ['1D', '5D']
params = ['', hist, (25, 'T')]
for i_func, func in enumerate(func_list):
class_obj = class_X(A,B,func)
for window in windows:
args = (window, params[i_func]) # params is a list or tuple of other params for funcs e.g.
class_obj.run_func(args)
而在另一個模塊
class class_X(object):
def __init__(self, a, b, func_to_run):
self.a = a
self.ts = b
self.method = func_to_run
def generate_output(self, *args):
return self.method(self.ts, args) # time series is common and fixed for all, other params differ or change
上面的代碼是行不通的,因爲我覺得功能我打電話需要改變使用*args
,而不是有固定的定義參數。
我認爲*args
是爲輸入參數的數量未知的函數,但我試圖在輸入參數的數量已知,但循環中的不同函數不同的情況下使用它。
是否有任何解決方案,我不需要修改功能模塊,仍然可以將所有必需的參數作爲單個對象(e.g. list or tuple
)?
編輯 -
macromoonshine的回答狀態,我可以使用kwargs這樣的:
def generate_output(self, **kwargs):
return self.method(self.ts, kwargs)
經過這樣的修改,你可以調用generate_outputs()如下:
x.generate_outputs(window ='1D', max_lag=25, use_probability ='T')
其中紅雙喜實例你的班級X
這可以加強,所以我可以通過除了time_series和window之外的參數作爲循環中的查找值,例如,
x.generate_outputs(window ='1D', params[iloop])
其中
params[iloop] = max_lag=25, use_probability ='T'
我試着這樣做:
params = (30, "F")
x.generate_outputs(window, *params)
但得到一個錯誤
TypeError: generate_output() takes 1 positional argument but 4 were given
查找關鍵字參數。 '** kwargs' – flakes