読者です 読者をやめる 読者になる 読者になる

simplegeneric

Python

id:Voluntasさんのエントリでsimplegenericというライブラリを知りました。


このライブラリは、通常Visitorパターンで実装するような処理を、Pythonのデコレータを使って書くことができるという、なかなか興味深いライブラリです。
具体的な使い方としては、ディレクトリ内のファイルの再帰的処理、XMLの処理、構文木からバイトコードの生成といった用途が考えられますが、いかんせん、バージョンが0.5ということもあって、まだ「痒いところに手が届かない」ライブラリです。


XML処理をsimplegenericを使って書いてみようとしたのですが、今の段階では無理っぽいです。ただ、ライブラリのコード自体は参考になります。
試しに、simplegeneric風にXMLを処理するサンプルコードを書いてみました。

# -*- encoding: utf-8 -*-
try:
    from xml.etree.ElementTree import iterparse
except ImportError:
    from cElementTree import iterparse

from urllib2 import urlopen

def generic(func):
    default = func
    dispatchers = {}
    
    def when_tag(tag):
        def decorate(f):
            return dispatchers.setdefault(tag, f)
        return decorate
    
    def dispatch(item):
        return dispatchers.get(item.tag, default)(item)

    dispatch.when_tag = when_tag

    return dispatch

@generic
def accept(item):
    # デフォルトの関数。なにもしない
    pass

@accept.when_tag("ProductName")
def name(item):
    # ProductNameタグのときの処理
    print "Product name:", item.text

stream = urlopen(r'http://api.kakaku.com/Ver1/ItemSearch.asp?Keyword=Mac+Book')
for event, item in iterparse(stream):
    accept(item)