with
with_statement ってあんまり知られてないなぁ。Python 2.5 からだけど。
from __future__ import with_statement import sys with file(sys.argv[0], 'r') as fp: for line in fp: sys.stdout.write(line)
with のブロックに入った直後に __enter__ が、ブロックをでるときに(例外があれば例外の情報付きで) __exit__ が呼ばれる。で、例外発生時に __exit__ が true を返すと、例外抑制、true 以外を返すと例外が再 raise。
from __future__ import with_statement import sys class foo(object): def __enter__(self): print 'enter' def __exit__(self, *excinfo): print 'exit %s' % repr(excinfo) return True for i in range(3): with foo() as f: print 'content' if i == 1: raise Exception() if i == 2: break