2008年5月26日

itertoolsでフィードを処理する 続き

functoolsやitertoolsを使って整理してみた。

import feedparser
import itertools
import functools

def fetchfeed(url):
d = feedparser.parse('http://feeds.feedburner.jp/AodagBlog')
return d.entries

def yearMonth(entry):
return (entry.updated_parsed[0],
entry.updated_parsed[1])

def groupbyYearMonth(entries):
return itertools.groupby(entries, yearMonth)

def tags(entry):
return [tag.term for tag in entry.get('tags', [])]

def tagIncludes(word, entry):
return word in tags(entry)

def pipe(func1, func2):
return lambda x: func2(func1(x))

def createFilter(filterfunc):
return functools.partial(itertools.ifilter,
filterfunc)
def createMapper(mapperfunc):
return functools.partial(itertools.imap,
mapperfunc)

def createGroup(groupfunc):
return lambda iter: itertools.groupby(iter, groupfunc)

createCommand = functools.partial(reduce, lambda x, y:pipe(x, y))
command = createCommand([fetchfeed,
createFilter(functools.partial(tagIncludes, 'wsgi')),
createGroup(yearMonth),
createMapper(lambda x: (x[0], [e.title for e in x[1]])),
list
])

print command('http://feeds.feedburner.jp/AodagBlog')



多分これで、処理の入れ替えとかできるはず。
ただし、処理がリストってことは、複数フィードをマージするなどの処理ができない。
ツリー版のreduceなんかが必要になると思う。
Blogged with the Flock Browser