Pythonのwith構文を覚えた!

基本的な使い方

ファイルを開いて読み込む処理が典型的かな。今まではこうしていた:

f = open('data.txt', 'r')
print f.read()
f.close()

with 構文を使うとこう書ける:

with open('data.txt', 'r') as f:
    print f.read()

開いたファイルは、ブロックを抜けるときに自動で閉じてくれる。

withに対応したクラス

with 構文に書けるクラスはファイルだけじゃない。__enter____exit__ の2つのメソッドを持ったクラス(のインスタンス)なら何でもいい。__enter__ はブロックに入るときに、__exit__ はブロックを抜けるときに呼ばれる。
ちょっと試してみよう。

class Test():
    def __init__(self, hoge):
        print 'init'
        self.hoge = hoge

    def print_hoge(self):
        print self.hoge

    def __enter__(self):
        print 'enter'
        return self

    def __exit__(self, type, value, traceback):
         print 'exit'

with Test('hoge') as t:
    t.print_hoge()

実行結果:

takatoh@apostrophe $ python test_with.py
init
enter
hoge
exit

ブロックの中を実行する前に __enter__ が、あとに __exit__ が呼ばれているのがわかる。
as t: の部分の t には、__enter__ の返り値が代入されるので、self を返している。

ともあれ、1行短くなって見やすくなる。これからはこうやって書くようにしよう。