ファイルの open 処理に with文が使われるようになって久しいです。
改めて、with文の役割とは何でしょうか?
大雑把に言うと、1つ目のソースコードと2つ目のソースコードはほぼ同じ動きをします。
>>> with open(filename) as file ... data = file.read()
>>> file = open(filename) >>> try: ... file = file.__enter__() ... data = file.read() ... finally: ... file.__exit__()with文を使うことで、いちいち try - finally を書く必要がなくなり、プログラムの見通しがずっと良くなります。特に try と finally との間が長くなってしまう場合、可読性の点での恩恵は大きいです。
また、__exit__() は with のスコープを出る直前に呼ばれることが保証されています。__del__() が呼ばれるタイミングは Python の実装依存ですので、with + __exit__() の組み合わせはより制御しやすい動作であると言えます。
さらに、__enter__() と __exit__() の呼び出しが保証されることは、with文で呼ばれるオブジェクトにとって、非常に重要な意味を持ちます。
「with文で呼ばなければ何も動作しないクラス」を定義することで、クラスの正しい使い方を強制することができます。これは、「このクラスの open() と close() は必ずペアで呼び出して下さい」とコメントで書くよりも遥かに安全なクラスの書き方となります。
次項にて with文で動作するクラスの具体的な例を示します。
0 件のコメント:
コメントを投稿