假设我想定义一个元函数,它接受一个函数作为参数并返回一个新的修改后的函数。有点像
metaf(f) -> f**2
因此无论 f 会产生什么结果,metaf 都会得到 2 的幂的答案(如果结果不能提高到 2 的幂,那么它。引发错误)。
目前我发现这样做的方式需要在 metaf 的定义中显式引用 f 的参数,即 define
metaf = lambda f, x : f(x)**2
然后
mynewf = lambda x : metaf(f, x)
这行得通,但我想知道它是否适用于输入参数可能有很多变化的复杂参数函数。
所以我想知道您是否可以建议一种不同的方式,尤其是不需要在 metaf 定义中指定参数的方式。
编辑:下面的两个答案都有帮助。仅供引用,根据答案,我也意识到了使用 lambda 表达式定义 metaf 的方法。有点麻烦,但可能仍然值得注意:
metaf = lambda func: lambda *args, **kwargs : func(*args, **kwargs)**2
请您参考如下方法:
我相信这就是您所追求的:
def metaf(f):
def func(*r, **kw):
return f(*r, **kw) ** 2
return func
现在让我们定义一些f...
def f(a, b):
return a + b
这里是转换它:
mynewf = metaf(f)
试一试:
In [148]: f(10, 20)
Out[148]: 30
In [149]: mynewf(10, b=20)
Out[149]: 900
请注意在 mynewf 的使用中使用普通参数和关键字参数。我的工作如您所料。
