动态Python函数参数重新路由

时间:2019-12-03 10:38:17

标签: python-3.x function dynamic arguments

我有一个python函数

func(a, b, c, d, e)

我想将此函数传递给另一个对其求值的函数。结果是,该另一个函数仅改变参数(a, b, c, d, e)的任意子集,而其他参数应预加载一个常量。参数顺序也可能会更改。

例如:我希望func_2改变a,c和d,而b = 3和e = 4。所以我需要一个例行

def convert(func, variables=[3, 0, 2], constants=[1, 4], vals=[3, 4]):
    ...
    python magic
    ...
    return func_2
进行转换的

func(a, b, c, d, e)-> func_2(d, a, c, b=3, e=4)

所以当我打电话给func_2(1, 2, 3)时,实际上所谓的幕后就是func(2, 3, 3, 1, 4)

(这是一种用于在参数空间的子空间上运行的优化算法,这些子空间可以在周期之间变化。func是代价函数。)

如何在Python 3中编码convert

2 个答案:

答案 0 :(得分:1)

这有效:

def convert(func, vars, fixed):
    # vars: list of indices
    # fixed: dictionary mapping indices to constants
    n = len(vars) + len(fixed)
    def func_2(*args):
        newargs = [None] * n
        for i, j in enumerate(vars):
            newargs[j] = args[i]
        for k in fixed:
            newargs[k] = fixed[k]
        return func(*newargs)
    return func_2

答案 1 :(得分:1)

这里您有可能的解决方案:

def convert(func, var, const, vals):
    def func2(*args):
        params = [args[var.index(i)] if i in var
                  else vals[const.index(i)]
                  for i in range(len(var)+len(const))]
        return func(*params)
    return func2

它可以与任意数量的参数一起使用