Date Modified Tags python / django

pythonのデコレーターを使ってみたらとても便利だなと思ったのでメモ

参考にしたページを読んでいくと理解できた。要はデコレーターとして使う関数は引数に呼び出し元の関数を貰っておいて、内部で作った関数を返せば良い。内部の関数は適当に作れるみたい(今のとこそういう理解をしている)。djangoのビューで呼び出したかったので、内部の関数で可変長引数を取れるようにして下のようにしたら動いた。

def outer(func):
    def inner(*args,**kwargs):
        print "hoge"
        return func(*args,**kwargs)
    return inner

この時、args[0]にHttpRequestオブジェクトが入ってるので、これをいじると適当に値を追加したり整形したりするのをビューの外部に持っていけるので、使いようによっては共通部分と個別部分の分離や、ビューに直接関係ない処理(ログとか)を分離出来るので便利な感じがする。ただ、やりすぎるとコードが分割されすぎて読みにくくなる気もする。

def outer(func):
    def inner(*args,**kwargs):
        request = args[0]
        request.hoge = "fuga"
        return func(*args,**kwargs)
    return inner

@outer
def hoge(request):
    print request.hoge
    ....

とやったりすることが出来る。個人的にはWebサービスでサイドメニューに必要な情報をデコレーターでやって、メインコンテンツに必要な情報をビューでやるとかそんな感じで使ってみようと思う。

参考:Pythonのデコレータを理解するための12Step - Qiita