如何在 python 中使用 *args
How to use *args in python
我有一个功能模块,其中一些功能全部带有一些通用输入,而另一些则是它们特有的。例如
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 是您的 class 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
您可以使用 **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
是您的 class 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)
我有一个功能模块,其中一些功能全部带有一些通用输入,而另一些则是它们特有的。例如
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 是您的 class 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
您可以使用 **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
是您的 class 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)