从给定组件以编程方式构造一个Python函数

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

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

我可以用 Python 做什么? 写入文件并加载它? 使用

exec
eval

python function eval
1个回答
0
投票

我建议重写您的函数以接受任意数量的关键字参数。然后,您可以简单地将任意关键字参数列表传递给这两个函数,而无需从外部知道它们的签名:

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))
© www.soinside.com 2019 - 2024. All rights reserved.