我正在寻找一种 pythonic 方式将预期的参数列表传递给包装函数。问题是预期的参数因传递给包装器的函数而异。
就我而言,我想重构(重复)代码,以递归方式模拟多种类型的时间序列。除了 for 循环中的更新步骤外,结构(几乎)相同。为此,我决定引入一个包装函数
simulate
,它将update
函数作为参数。但是,代码变得不那么可读了,因为我需要传递给 update
函数的参数因时间序列类型而异。写这个的 pythonic 方式是什么?
为了说明问题,我展示了如何分别生成斜坡和自回归过程。
import numpy as np
def autoregressive_process():
# magic numbers
iT = 100
lag = 1
phi = 0.02
# initialize
vY = np.empty(iT)
vX = np.random.rand(iT+lag)
vEps = np.random.rand(iT)
# generate observations
for t in range(lag,iT):
# updating step
vY[t] = phi * vX[t-1] + vEps[t]
return vY
import numpy as np
def ramp_process():
# magic numbers
iT = 100
# initialize
vY = np.empty(iT)
vEps = np.random.rand(iT)
# generate observations
for t in range(iT):
# updating step
vY[t] = (t % 10) + vEps[t]
return vY
请注意,例如,斜坡过程不需要
X
变量,而自回归过程不需要时间段。
包装函数的介绍是这样的:
import numpy as np
def autoregressive(time, phi, X_lag, error):
return phi * X_lag + error
def ramp(time, phi, X_lag, error):
return (time % 10) + error
def simulate(update):
# magic numbers
iT = 100
lag = 1
phi = 0.02
# initialize
vY = np.empty(iT)
vX = np.random.rand(iT+lag)
vEps = np.random.rand(iT)
# generate observations
for t in range(iT):
vY[t] = update(t, phi, vX[t-1], vEps[t])
return vY
请注意,我需要将 两种时间序列类型所需的所有变量 传递给包装的
update
函数——即使它们不相关。