デコレータ

Pythonにはデコレータ構文がある。
関数を他の関数で包んで、機能を追加するのが(使う分には)簡単にできる構文だ。
TurboGearsでは、テンプレートの指定や入力チェック、認証チェックなどをデコレータで行うようになっている。
詳しい説明は以下の資料で。
http://www.nasuinfo.or.jp/FreeSpace/kenji/sf/python/virtualMachine/decorator.htm

デコレータを実際に作る方法も上記資料で詳しく述べられているが、Python2.5から使えるfunctools.partialを使った方法を検討してみた。

まず、クロージャだけで実現させる例。
二重にクロージャ書くのがだるい。っていうか分かりにくい
関数をうけとって関数を返す関数を返す?

def trace(before, after):
    def decorate(func):
        def trace_func(*args, **kwargs):
            before()
            result = func(*args, **kwargs)
            after()
            return result
        return trace_func
    return decorate

def before():
    print "before"

def after():
    print "after"

@trace(before, after)
def hello():
    print "hello"

呼び出し可能オブジェクトを使った例。
引数を受け付けるのがコンストラクタに移るので、クロージャが一段減る。

class Trace(object):
    def __init__(self, before, after):
        self.before = before
        self.after = after

    def __call__(self, func):
        def trace(*args, **kwargs):
            self.before()
            result = func(*args, **kwargs)
            self.after()
            return result
        return trace

def before():
    print "before"

def after():
    print "after"

@Trace(before, after)
def hello():
    print "hello"

パーシャル関数を使った例
引数設定をパーシャルで固定して、ラップする関数を引数とした関数にする。
デコレータの書き方が上のやつと変わってしまうのが難点。

from functools import partial

def trace(before, after, func):
    def trace(*args, **kwargs):
        before()
        result = func(*args, **kwargs)
        after()
        return result
    return trace

def before():
    print "before"

def after():
    print "after"

@partial(trace, before, after)
def hello():
    print "hello"

もう少し検討すれば、paritalの恩恵を受けつつ通常と同じ書き方ができそうな気がするのだが。

その他

う、両方とも詐欺師だ。

ハンマーセッション!(3) (講談社コミックス)

ハンマーセッション!(3) (講談社コミックス)

クロサギ 14 (ヤングサンデーコミックス)

クロサギ 14 (ヤングサンデーコミックス)

Q.E.D. 27

鏡像
鏡像は左右逆に見えるけど上下逆に見えないのはなぜ?
見える(思える)だけってことだね。

立証責任
ラストの燈馬がかっこよすぎ。
裁判員制度がちゃんと機能すれば、検察は手が抜けなくなるってーことだよね。

Q.E.D.証明終了(27) (講談社コミックス月刊マガジン)

Q.E.D.証明終了(27) (講談社コミックス月刊マガジン)

OCamlを勉強しようと思う

Concurrent Cleanを勉強しようと思っていたのだが、単純にMacPortsに入っていなかったので却下。:-p
個人的な観点

型推論とモジュールシステムに酔ってみようと思う。

入門OCaml ~プログラミング基礎と実践理解~

入門OCaml ~プログラミング基礎と実践理解~

とりあえず本買った。

赤い夢の迷宮

初読み。
ジュブナイルじゃないので、勇嶺名義だそうで、っていうか描写が...
仕掛けというか舞台装置はいいんですけど、実行犯の最後があっけなさすぎない?

赤い夢の迷宮 (講談社ノベルス)

赤い夢の迷宮 (講談社ノベルス)

Launchpad O/Rマッパー

Ubuntuの開発拠点Launchpadで使われているというO/Rマッパー Strom が公開された。
https://storm.canonical.com/ ここに直接アクセスすると"フロントページ"にリダイレクトされてしまい、MoinMoinの初期ページなのはなぜなんだぜ?
と思っていた。
ふと気がつき、FrontPageにアクセスしてみたら、こっちが正解。
https://storm.canonical.com/FrontPage
i18nの罠だなこれは。
ちらーっとTutorialを斜め読みした感じでは、アクティブレコード型なのかな。
この系統だとSQLObjectが有名どころ。
あと、SQLAlchemy上のElixirあたりか。
データアクセスをとにかくpythonicにかけるSQLObjectと比べて、普通のSQLクエリも使っちゃうところはいいのかわるいのか....