用不同的参数调用包装函数

问题描述 投票:0回答:0

我正在寻找一种 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
函数——即使它们不相关。

python refactoring
© www.soinside.com 2019 - 2024. All rights reserved.