首页 > 解决方案 > 动态 Python 函数参数重新路由

问题描述

我有一个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是一个成本函数。)

如何convert在 Python 3 中编码?

标签: python-3.xfunctiondynamicarguments

解决方案


这有效:

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

推荐阅读