デコレータについて勉強しなおし
最近マイクロフレームワークのFlaskで遊んでいます。
Welcome to Flask — Flask Documentation (0.12)
Djangoより軽量で、私のようにちょっとWebアプリケーション開発っぽいことを趣味でやってみたい、 という人間にはぴったりだと思います。
さて、FlaskではViewとPython関数がデコレータを用いて1:1対応づけされます。
このデコレータの仕組みをよくわかっていなかったので下記サイト様を参考に復習してみました。
内容を要約すると、
- Pythonでは関数もファーストクラスオブジェクトであり、関数を引数・戻り値に取る高階関数を定義できる
- Pythonはクロージャの機能を持ち、関数定義時のスコープを保存できる
- ファーストクラスオブジェクトとクロージャを用いて、既存の関数を機能拡張した関数を再定義できる
- 上記再定義を簡略化した構文がデコレータ
といったところでしょうか。
デコレータを用いないサンプルコードを下記に示します。
def wrapper(func): # 関数を引数に取る高階関数 def inner(): return func()+1 return inner def foo(): return 1 foo = wrapper(foo) # fooの再定義
同じことをデコレータ構文を用いると、下記のようなコードになります。
def wrapper(func): def inner(): # return func()+1 return inner @wrapper # デコレータ def foo(): return 1
わかってみると以外と単純な気もします。