在链函数调用中向下传递参数的pythonic方法是什么?说我有以下功能:
def get_remainder(timeseries,freq, model='additive', item='residue'):
if item == 'residue':
return decompose(timeseries, freq=freq, model=model).residue
elif item == 'trend':
return decompose(timeseries, freq=freq, model=model).trend
出于这个问题的目的,decompose
函数存在并且并不重要。它以 multiplicative 或 additive 作为字符串作为模型。如您所见,get_remainder
返回残差或趋势。总而言之,我们在这里有四个选择。我们可以
问题是get_remainder
是链中的最后一个呼叫:
def func1(data, params):
# does something to data, maybe shape is different, maybe some elements deleted etc.
return func2(data, params)
def func2(data, params):
# does something to data
return func3(data, params)
def func3(data, params):
# does something to data
remainder = get_remainder(timeseries,freq, model=params['model'], item=params['residue']):
# does something to remainder.
returns remainder <> data
其中<>
表示涉及余数和数据的某种操作。我希望能够从第一个函数func1
中获得所有四种类型,因此我一直在model
参数的链中传递item
和params
。
但是对我来说,这似乎很不可思议。中间函数都没有直接使用model
和item
(尽管params
可能包含其他参数),它们只是随身携带它,因此最后一个函数可以使用它。
有什么更好的方法?
答案 0 :(得分:1)
您正在寻找**kwargs
(关键字参数)语法。现在,您可以使用任意数量的关键字参数调用func1
,这些关键字参数将被收集到名为params
的字典中。调用另一个函数时,可以使用字典拆包语法params
来拆包**params
。因此func2(data, **{"model": "additive"})
与func2(data, model="additive")
相同。
如果函数签名中包含关键字参数,则它将作为**params
的一部分被收集。对于功能def f(a=1, **kwargs)
,调用f(**{"a": 2})
将使kwargs
为空。
def func1(data, **params):
# does something to data, maybe shape is different, maybe some elements deleted etc.
return func2(data, **params)
def func2(data, **params):
# does something to data
return func3(data, **params)
def func3(data, **params):
# does something to data
remainder = get_remainder(timeseries,freq, **params)
def get_remainder(timeseries,freq, model='additive', item='residue'):
if item == 'residue':
return decompose(timeseries, freq=freq, model=model).residue
elif item == 'trend':
return decompose(timeseries, freq=freq, model=model).trend