2015年12月13日

with文の話1

Python の with文の基本的な事柄についてお話します。

ファイルの 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 件のコメント:

コメントを投稿