在python中构造新的函数对象时使用函数对象的输入变量之一?

我有一个 function-object f,它需要 4 个数字输入并输出两个数字。也许

def  f(a, b, c, d):
    return a+b, c+d

或者可能

def  f(a, b, c, d):
    return a*c, d*c

需要明确的是,我实际上不知道是什么f,我只是将它作为一个对象。

我想创建一个新的函数对象h,这样h(a,b,c,d)=x*c+ywhere (x,y)=f(a,b,c,d)。问题是,我无法直接访问c,只能访问f

def  make_h(f):
   ???
   return h

assert( make_h(f)(a,b,c,d) == f(a,b,c,d)[0]*c+f(a,b,c,d)[1])

可以在python中做到这一点吗?我试过搜索和阅读一些文档,但还没有找到答案(还没有?)。

编辑:当 f 的签名固定时,有一个简单的答案(如下所示)。假设我必须对不同的函数执行此操作,一些带有输入 (a, b, c, d),一些带有输入 (l, m, c),还有一些带有输入 (c, r)。仍然可以做我想做的事吗?

回答

这个例子与装饰器的概念密切相关。我的解决方案如下:

def make_h(f):
def h(a, b, c, d):
x, y = f(a,b,c,d)
return x * c + y
return h

更新。如果f有任意数量的参数,我们可以使用 args 和 kwargs。虽然这是一个不好的做法,但如果我们知道 kwargs 之一是 c,我们可以使用以下代码:

def make_h(f):
def h(*args, **kwargs):
x, y = f(*args, **kwargs)
return x * kwargs["c"] + y
return h

以上是在python中构造新的函数对象时使用函数对象的输入变量之一?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>