2017-11-11 13 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を使うように変更する必要があります。

私は入力パラメータの数がわからない関数を意味しますが、入力パラメータの数はわかっていますが、ループ内のさまざまな関数によって異なります。

機能モジュールを変更する必要がなく、必要なすべてのパラメータを1つのオブジェクトとして渡すことができる修正がありますか(e.g. list or tuple)?

編集 -

macromoonshineの答え状態私はこのようなkwargsからを使用することができます。

インスタンスをXIS
x.generate_outputs(window ='1D', max_lag=25, use_probability ='T') 

を:

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

この変更では次のように)(generate_outputsを呼び出すことができますあなたのクラスのX

これは私が合格できるように強化することができますループ内のルックアップ値としてtime_seriesおよびwindow以外のargs。

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を使用することができます。これは、各機能を呼び出すよりも簡単に行う必要があります。

xがあなたのクラス Xのインスタンスである
x.generate_outputs(time_series, window ='1D', max_lag=25, use_probability ='T') 

を次のようにあなたがgenerate_outputs()を呼び出すことができます。この変更により

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

:あなたは自分のコード内でごgenerate_outputs()方法を変更する必要があります。

パラメータの代わりに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とウィンドウ以外の引数を渡すことができます。 'params [i] = max_lag = 25、use_probability = 'T'' – dayum

+0

申し訳ありませんが、あなたは正しいです。私はこれのために私のポストを適応させました。 – clemens

関連する問題