我有一个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
?
此作品:
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
这里您有可能的解决方法:
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
它可以与任意数量的参数一起使用