在 python 中构造新函数对象时使用函数对象的输入变量之一?
Using one of the input variables to a function-object in constructing a new function-object in python?
我有一个函数对象 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+y
其中 (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
我有一个函数对象 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+y
其中 (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