Pythonのデコレータで、コミュ障をアピールしてみる

エキスパートPythonプログラミングを読み中です。

エキスパートPythonプログラミング

エキスパートPythonプログラミング


で、デコレータあんま分かんねえなってことで、ちょっと調べたことをメモします。

>>> def komyushou(f):
...     # デコレータっぽい挙動で、会話をコミュ障っぽくする。
...     print "ア..アッ..."
...     f()
...     print "サセン.."
... 
>>> def hello():
...     print "こんにちは"
... 
>>> hello()
こんにちは
>>> komyushou(hello)
ア..アッ...
こんにちは
サセン..

こんな感じで書くと、関数に渡すだけで、挨拶をコミュ障っぽくできるわけです(自虐を含みつつ)。

で、これだとまだは汎用性というか、毎回komyushou(hello)なんて呼び出さなきゃいけないんです。だから、

>>> def dec_komyushou(f):
...     # 関数の中にまた関数を定義する
...     def wrap_komyushou():
...             print "ア..アッ.."
...             f()
...             print "サセン..."
...     # ラップした↑の関数を返せば、fをコミュ障でラップできるってな感じ
...     return wrap_komyushou
... 
>>> wrapped_komyushou=dec_komyushou(hello)
>>> wrapped_komyushou()
ア..アッ..
こんにちは
サセン...

で、かつ、これを言語の機構を使ってラップすると、

>>> @dec_komyushou
... def seeyou():
...     print "さようなら"
... 
>>> seeyou()
ア..アッ..
さようなら
サセン...

こうなるわけです。つまり@dec_komyushouって書いて関数を作っても、上で書いたみたいに"ラッピングする関数そのもの"、つまりdec_komyushou( [ラップする関数] ) って書いても同じっていうわけです。

で、なんか実際@wrapsとかいうのとか、あるっぽいですが、とりあえずコミュ障をアピールできたということで、ここらへんですかね。

参考URL : Pythonのデコレータ(decorator)を理解する 1 - Soleil cou coupé
分かりやすかったです。