2010年4月1日木曜日

pythonのデコレータは

pythonのデコレータは、なかなか面白い発想ですね。

pythonでは、
関数宣言は、「callableオブジェクトの作成」でしかない、ので、
関数宣言自体を、他の関数の引数に渡せる、と言うことであって、
それだけでも、wrapper関数を、サラリと書ける。
と言うことなのだろう。と思う。

python2.3以前でも、
staticmethod「ビルトイン関数」を通して、
同じ変数(メソッド名)に入れ直す、みたいな構文はあったのですが、

python2.5からのデコレータ構文を、
class文の中で使って、デコレータ関数からcallableオブジェクトを返すと、
どうやらそれを新しい関数宣言として使ってくれる。らしい。

まあ2.5自体、2年以上前のリリースなので、時期的には今更ですが、
筆者個人は、python歴1年生なので、筆者としては衝撃です。

オブジェクト指向の軽量言語ならではの発想です。
軽量言語であっても、関数類の再定義を認めてないものが殆どです。

C++/Cまで遡れば、構造体の関数ポインタを入れ直す感じに似てますね。

関数をサラリと再定義できるのさることながら、
1行書き足すだけで使える、のが素晴らしい。

とりあえず思いついたのは、appengineのRequestHandler。
SDKでテストしているうちは何とも無かったのだけど、
appengineに突っ込んでみたら、Quota系例外がボコボコ出るので、
基本、try/exceptは遣っておいた方が良い。
のですが、デバッグ中は逆に面倒だったりします。

そこでデコレータの出番です。
作ってみた。gistにあり升

http://gist.github.com/351412