我有一个功能模块,它具有一些带有一些共同输入的功能,以及其他特有的功能。 e.g。
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是您的类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
答案 0 :(得分: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
的实例。
如果要从kwargs
代替命名的参数传递dict
,则必须在字典变量前加**
。改编后的代码应如下所示:
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)