Python通过函数调用链传递参数

Python通过函数调用链传递参数,python,python-3.x,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

什么是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
就本问题而言,
分解
功能存在,并不重要。它将乘法或加法作为字符串作为模型。如您所见,
get_rements
返回剩余值或趋势。总之,我们有四个选择。我们可以

  • 型号=‘添加剂’,项目=‘趋势’
  • 型号为“添加剂”,项目为“残留物”
  • 模型=‘乘法’等
问题是
get_rements
是链中对的最后一个调用:

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 
def func1(数据、参数):
#对数据做了一些修改,可能形状不同,可能删除了一些元素等等。
返回func2(数据、参数)
def func2(数据、参数):
#对数据做些什么
返回func3(数据、参数)
def func3(数据、参数):
#对数据做些什么
余数=获取余数(timeseries,freq,model=params['model'],item=params['residence']):
#对余数做点什么。
返回剩余数据
其中
表示涉及余数和数据的某种操作。我希望能够从第一个函数中获取所有四种类型,
func1
,因此我一直在
model
item
params
参数中向下传递

但对我来说,这似乎很奇怪/不太像蟒蛇。中间函数中没有一个直接使用
model
item
(尽管
params
可能包含其他参数),它们只是带着它,以便最后一个函数可以使用它


有什么更好的方法可以做到这一点呢?

您正在寻找
**kwargs
(关键字参数)语法。现在,您可以使用任意数量的关键字参数调用
func1
,这些参数将被收集到名为
params
的字典中。调用另一个函数时,可以使用字典解包语法
**params
解包
params
。因此
func2(数据,**{“模型”:“加法”})
func2(数据,模型=“加法”)
相同

如果函数签名中包含关键字参数,则它将作为
**params
的一部分收集。对于函数
def(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

您可以创建一个对象,并将
模型
/``item`作为实例成员原始的
获取余数
可以像这样一行:
返回getattr(分解(…),item)
仅是
func1
func2
的结果总是无趣的吗?但据我所知,相当多的库使用
**kwargs
不断地传递参数。谢谢!我最近听说了python中的装饰器。使用decorators可以解决这个问题吗?
kwargs
是标准方法吗?
kwargs
绝对是标准方法。我想不出一个使用装饰器的好方法。