假设我想定义一个接受函数作为参数的元函数,并返回一个新的修改函数。像
这样的东西metaf(f) -> f**2
因此无论f
结果如何,metaf
都会得到2的幂的答案(如果结果不能提升到2的幂,那就这样吧。提出错误)
目前,我发现这样做的方式需要在f
的定义中明确提及metaf
的论点,即定义
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
答案 0 :(得分:4)
我相信这就是你所追求的:
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的使用中使用普通参数和关键字参数。我按你的预期工作。
答案 1 :(得分:3)
您应该能够使用*args
和**kwargs
来吞噬所有其他参数并将其传递出去:
def squarer(f):
return lambda *args, **kwargs: f(*args, **kwargs)**2
>>> squarer(lambda x: x+1)(3)
16
>>> squarer(lambda x: x+1)(4)
25
>>> squarer(lambda x,y: x+1)(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in <lambda>
TypeError: <lambda>() takes exactly 2 arguments (1 given)
>>> squarer(lambda x,y=1: x+y)(4)
25
>>> squarer(lambda x,y=1: x+y)(4,2)
36