动态Python函数参数重路由

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

我有一个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

python-3.x function dynamic arguments
1个回答
0
投票

此作品:

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

0
投票

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

import inspect

def convert(func, var, const, vals):
    def func2(*args):
        names = inspect.getfullargspec(func)[0]
        params = ",".join(f"{name}={args[var.index(i)]}" if i in var
                          else f"{name}={vals[const.index(i)]}"
                          for i, name in enumerate(names))
        return eval(f"func({params})"
    return func2

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

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