1

私は Python 関数デコレーターを理解しようとしていますが、これまでのところ、関数デコレーターがファースト クラス関数を使用して実行できなかったことを実行できるケースは見当たりません。

例として、logger decoratorは便利な関数デコレータの簡単な例としてよく挙げられます。

def logger(f):
    def new_f():
        print("Calling %s" % f.__name__)
        return f()
return new_f

このデコレーターは、ログに記録したい関数と一緒に古典的に使用されます。

@logger
def fun1():
    [do something]

ただし、同じ結果を得るには、 func1 を定義して logger でラップするだけで済みます。

def fun2():
    [do something]
def logged_fun2():
    return logger(fun2)()

呼び出しlogged_fun2は の呼び出しに似ていfun1ます。さらに、 でラップfun2すると、必要に応じて、ログを記録せずloggerにオリジナルを呼び出すことができます。fun2

ファーストクラス関数を使用してできないデコレータでできることはありますか? それとも、関数をラップするためのシンタックス シュガーの形式としてデコレータを検討する方がよいでしょうか?

4

1 に答える 1

1

デコレータの構文:

@deco
def f(...):
    ...

は、次の構文とまったく同等であると定義されています。

def f(...):
    ...
f = deco(f)

いいえ、ファーストクラスの関数ができないことでデコレータができることは何もありません。デコレータ第一級の関数です。

于 2014-08-19T03:00:13.703 に答える