dict.pop()対策

Python 2.3から、組み込みオブジェクトdictにpop()というメソッドが追加されました。web.pyではこれを使っています。しかし当然Python 2.2にはdict.pop()はありません。そこで、代替となるような関数を用意してやります。

/site-packages/web.py input()関数内、1733行目付近に追加

    def dictpop(d, k, x=None):
        try:
            return d[k]
        except KeyError:
            if x: return x
            else: raise KeyError()

    #_method = defaults.pop('_method', 'both')
    _method = dictpop(defaults, '_method', 'both')

本当は、

  1. 組み込み型のdictを拡張してpopメソッドを追加
  2. その拡張したPoppableDictみたいなクラスをdictという名前にマッピング
  3. 以降すべてのdictオブジェクトはPoppableDictとして扱われる

といった感じの理想的なシナリオを考えていたのですが、この変更を関数の引数としてのdictにまで反映させるのは無理なようです。今のところdict.pop()を使っているのはここだけなので、このような方法をとりました。

さて、これでようやくPython2.2でもweb.pyが使えるようになりました。

こういう技術メモはどんどん公開したほうがいいですね。前回の「CGI環境でweb.pyを動かす」も、このダイアリでは、はてブのブクマ数が一番多かったりするし。

あと、自分でライブラリを公開するときは、最近追加された関数を使いすぎると、利用環境を限定してしまうなぁ、と思いました。