私はいくつかの一般的な入力とそれらに特有のその他の機能を持つ関数モジュールを持っています。例えば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からを使用することができます。
インスタンスをXISx.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
ルックアップキーワード引数。 '** kwargs' – flakes