我有一个Python函数列表,例如,
def f1(x, a): return x + a
def f2(x, y, a, b): return x * a + y * b
def f3(c, d, e): return c * d - e
def f4(y, z): return 2 * y - z
...
my_functions = [f1, f2, f3, f4 ...]
并且我想以预定义的方式组合所有对,例如,通过采用产品:
my_products = [product(f,g) for f,g in itertools.combinations(my_functions, 2)]
因此
product
需要 2 个函数,f
和 g
,并生成一个计算它们的乘积的函数: product(f1,f2)
应该返回
def f1_f2(x, a, y, b):
return f1(x=x, a=a) * f2(x=x, y=y, a=a, b=b)
如果使用 Lisp,我会使用一个简单的 宏。
使用 Perl,我会创建
f1_f2
的字符串表示形式并使用 eval
。
exec
?
eval
?
我建议重写您的函数以接受任意数量的关键字参数。然后,您可以简单地将任意关键字参数列表传递给这两个函数,而无需从外部知道它们的签名:
def f1(**kwargs): return kwargs['x'] + kwargs['a']
def f2(**kwargs): return kwargs['x'] * kwargs['a'] + kwargs['y'] * kwargs['b']
def f3(**kwargs): return kwargs['c'] * kwargs['d'] - kwargs['e']
def f4(**kwargs): return 2 * kwargs['y'] - kwargs['z']
def product(f, g):
def fun(**kwargs):
return f(**kwargs) * g(**kwargs)
return fun
foo = product(f1, f2)
print(foo(x = 1, y = 2, a = 3, b = 4, c = 5))