Python通过函数调用链传递参数
什么是pythonic方式将参数传递给链函数调用?假设我有以下功能: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
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
绝对是标准方法。我想不出一个使用装饰器的好方法。