Python通过一系列函数调用传递参数

时间:2018-07-17 16:07:12

标签: python python-3.x

在链函数调用中向下传递参数的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返回残差或趋势。总而言之,我们在这里有四个选择。我们可以

  • model ='additive',item ='trend'
  • model ='additive',item ='residue'
  • model ='multiplicative'等。

问题是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参数的链中传递itemparams

但是对我来说,这似乎很不可思议。中间函数都没有直接使用modelitem(尽管params可能包含其他参数),它们只是随身携带它,因此最后一个函数可以使用它。

有什么更好的方法?

1 个答案:

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