基本的な使い方
ファイルを開いて読み込む処理が典型的かな。今まではこうしていた:
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行短くなって見やすくなる。これからはこうやって書くようにしよう。