Python 2.4 のデコレータ

Python 2.4 がリリースされてしばらく経ったが、今のところ環境は 2.3 のままだ。ライブラリなんかの関係で移行はもう少し先になるぽい。2.4 で追加された新機能のうち応用次第で色々出来そうなのがデコレータ。C# にも似たようなのがあるし、Java の方でも J2SE 5.0 (Tiger) からアノテーションが追加されたりと何かと最近流行だ。

とりあえずデコレータがどんなことをするのか調べようと http://www.python.org/doc/2.4/whatsnew/node6.html を見てみた。

@A @B @C
def f ():

このようにデコレータを使った場合、

def f():
    f = A(B(C(f)))

というコードに等しい。例として、

def require_int (func):
    def wrapper (arg):
        assert isinstance(arg, int)
        return func(arg)

    return wrapper

@require_int
def p1 (arg):
    print arg

というのがあったが、このデコレータを適用した関数 (p1) は自動的に引数の型が int であるかチェックされるようになる。Python のような言語で引数の型チェックを行う事が良いかどうかは別としてデコレータの使い方は分かりやすい。Python Cookbook の方でもデコレータを使ったレシピが出てる(Lazy property evaluation « Python recipes « ActiveState Code)。

デコレータを使うことで関数の処理を一部横取りして新しい機能を付加できるということだろうか。Aspect 指向?
利用方法として

def log_result(func):
    def wrapper(arg):
        result = func(arg)
        logger.log(result)
        return result
    return wrapper

@log_result
def do_something():
    # ...
    return result

みたいな感じで関数の出力をログに出せるとかか?