codecs.openにはwithステートメントが使えない

Python2.5以降で、withステートメントが使える。

with open('logfile', 'r') as logfile:
  logfile.write('hogehoge')

こうすると、open()で開いたファイルのclose()を暗黙的に、確実に呼んでくれる。withなしだと、こんなふうになって、ちょっと見苦しい。

logfile = open('logfile', 'r')
try:
  logfile.write('hogehoge')
finally:
  logfile.close()

さて、日本語のファイルを読み書きするとき、codecsモジュールのopen()を使うと便利だ。http://d.hatena.ne.jp/yach/20080308#p1

ところが、codecs.openはwithステートメントに対応しておらず、エラーも例外も出ない。原因はStreamReaderWriterの実装にあるらしい。ここに詳細があるが、このバグがどうなったかわからない。

とりあえず、codecs.openを使うときはwithステートメントが使えないということ。