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