2016-08-03 13 views
1

関数を引数として受け入れ、新しい変更された関数を返すメタ関数を定義したいとします。 fが生じるであろうものは何でもそう関数に作用して関数を返す関数

metaf(f) -> f**2 

metafのようなものが2のべき乗に答えてしまう(その結果が、2乗することができない場合はそう。それもエラーを上げて)。

現在、私はそれを行うために見つけた方法はmetafの定義におけるfの引数を明示的に参照する必要があり、つまりは、この作品

metaf = lambda f, x : f(x)**2 

、その後

mynewf = lambda x : metaf(f, x) 

を定義しますが、私は、入力引数に多くのバリエーションがある複雑な引数関数のためにそれが保持されるのだろうかと思います。

別の方法、特にmetaf定義で引数を指定する必要のない方法を提案できるかどうかは分かりません。

編集:以下の両方の回答が参考になった。ちょうど参考のために、私はラムダ式を使ってmetafを定義する方法を理解しました。少し面倒が、それでも注目に値するかもしれません:

metaf = lambda func: lambda *args, **kwargs : func(*args, **kwargs)**2 
+1

デコレータを実装しようとしていますか? – cdarke

答えて

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 
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のuseageにおける通常の引数とキーワード引数の両方を使用することに注意してください。私はあなたが期待するように動作します。

関連する問題