如何在python

时间:2017-11-11 09:14:23

标签: python oop args kwargs

我有一个功能模块,它具有一些带有一些共同输入的功能,以及其他特有的功能。 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

1 个答案:

答案 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)