自分なりにPythonのwith構文を解釈してみた
実際のwith構文
withはclassの生成と削除をコントロールすることで、RAIIを実現する手法。ローンパターンとか呼ばれている。Cとかだと良くあるメモリ開放忘れや、ファイルのclose忘れを回避する。
Pythonのwithは特別なclassが必要、という訳ではなく、通常のclassに特定の数の引数を持つ__enter__メソッドと__exit__メソッドがあればいい。
例えばこんな感じ
class withTest(object): def __init__(self, lst): self.lst = lst def put(self, it): self.lst.append(it) def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): for l in self.lst: print l return True if __name__ == "__main__": with withTest(["a", "b"]) as w: w.put("c")
これでa, b, cが出力される。
__exit__
withステートメントを抜けた際に呼び出される。3つの引数を持つ。Trueを返すと例外はそのまま伝搬するし、Falseだと例外を伝搬しない。