Pythonのwithはとてもよい設計。温もりを感じる。

みなさん、こんにちは。ひげさん(@1yaan)です。

Pythonのwithがとてもよい。Python考えた人の、「ミスらずにコーディングするには、設計が大事」っていう発想がとてもよいと思いますた。

このwithはとてもいいwithだ!

ファイル操作を、withを使わないで書く

f = open('sample.txt', 'r')
print f.read()
f.close()

ファイルを読み込んで1行目を出力し、ファイルを閉じる(close)。一見簡単ですが、readに失敗するとf.closeが実行されない!とか、メモリにゴミが!とか、いろいろ不具合の原因になります。

私がファイル操作の設計者だとしましょう。

「ファイル操作したくてopenしたら、closeしてよね!常識でしょ!!」

そう思うことでしょう。しかし、単純に忘れてしまっていたり、トラブルが発生したりするのです。

そこで!withという設計思想なんです!!

「これがあれば、みんな必ずcloseしてくれるよ!最高の設計だ!」

ファイル操作を、withを使って書く

with open('sample.txt', 'r') as f:
    print f.read()

closeどこ行ったよ!!と思うかもしれませんが、closeはopenと共にあります。フォースと一緒ですね。May the Force, be with you.

withをopenに対して使ってやると、「わかった!必ずcloseするよ!」と、約束してくれるのです。これなら、安心してopenできますね!

Pythonチュートリアルより

Pythonチュートリアルには以下のようにある。

 ファイルオブジェクトを扱うときはキーワードwithを使う、というのがよい習慣だ。その利点は、一連の操作から抜けるときファイルが正しく閉じられるということで、これは途中で例外が送出されたとしても処理される。またこれは、同等の動作になるtry-finallyブロックよりずっと短い。

>>> with open('workfile', 'r') as f:
...    read_data =f.read()
...    f.closed
True

オブジェクトによっては、不要になった際に(そのオブジェクトを利用した操作の成功失敗に関わらず)実行される標準のクリーンアップ動作が定義してある。以下の例を見てほしい。ファイルをオープンしてその内容を画面に表示するものだ。

for line in open ('myfile.txt'):
    print(line, end="")

このコードのの問題は、この部分を実行した後の不定時間の間、ファイルを開きっぱなしにしていることだ。単純なスクリプトではなんでもないことだが、大きなアプリケーションでは問題だ。with文を使うと、ファイルのようなオブジェクトを、使用後すぐに適切な方法でクリーンアップされることを保証した形で利用できるようになる。

with open('myfile.txt') as f:
    for line in f:
        print(line, end="")

この文の実行後、ファイルfは必ずクローズされる。行の処理中に問題が起きたとしても、常にクローズされるのだ。ファイルのようにクリーンアップ動作が定義してあるオブジェクトは、それぞれのドキュメントに明記される予定である。

まとめ

優れた設計思想のもとに言語が開発されていると、私たちプログラマのミスが減ります。Pythonは非常に洗練されていて、柔軟で、大人な老紳士的な優しさがあると私は思いました。

参考にしました。

スポンサーリンク
hige1
hige1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
hige1