2017-11-11 53 views
0

我有一個函數模塊,它有一些函數,都有一些常用的輸入,還有一些函數模塊對它們來說是特定的。例如如何在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 
+1

查找關鍵字參數。 '** kwargs' – flakes

回答

1

可以使用**kwargs,而不是允許任意關鍵字參數。這應該比清除每個功能更容易。你剛纔修改generate_outputs()方法在你的代碼:

def generate_output(self, **kwargs): 
    return self.method(self.ts, kwargs) 

經過這樣的修改,你可以調用generate_outputs()如下:

x.generate_outputs(time_series, window ='1D', max_lag=25, use_probability ='T') 

其中x是你X類的一個實例。

如果您想通過dict而不是kwargs而不是命名參數,則必須在字典變量前加**。經過調整的代碼應如下所示:

params = [{max_lag: 35, use_probability: 'F'}, ... ] 
TS= [1,2,3,4] 

for i_func, func in enumerate(func_list): 
    class_obj = class_X(TS, func) 
    for window in windows: 
     req_args = dict(params[i_func]) 
     req_args['window'] = 0 
     class_obj.generate_output(**req_args) 
+0

謝謝,我如何通過除了time_series和窗口以外的參數作爲我通過列表/元組等查找的參數。 'x.generate_outputs(time_series,window ='1D',params [i])'其中'params [i] = max_lag = 25,use_probability ='T'' – dayum

+0

抱歉,您是對的。我已經爲此調整了我的帖子。 – clemens