「正直、with文がよくわからない・・・」
「ファイル読み込み処理でclose()を書き忘れたことがある・・・」
「Pythonによる開発において、コード品質をもっと上げたい」
このような場合には、この記事が参考となります。
この記事では、Pythonにおけるwith文について初心者向けに解説しています。
本記事の内容
- with文とは?
- with文と例外処理
それでは、上記に沿って解説していきます。
with文とは?
with文を使うと、コーディングの質を改善できます。
例えば、以下のようなファイル読み込み処理のコードがあるとします。
file = open("file1.txt") text = "read=" + file.read() print(text) file.close()
上記コードでは、「file.close()」でファイルオブジェクトを開放しています。
オブジェクトの開放は、原則必須です。
オブジェクトの開放は基本中の基本です。
開放しないと、メモリ上にリソースが残ったままとなります。
しかし、コードが複雑になってくると開放漏れが生じることもありえます。
ミスは誰にでもありますからね。
そんなミスを未然に防いでくれるのが、with文と言えます。
with文を使うと、上記のコードは次のように書き換えることができます。
with open("file1.txt") as file: text = "read=" + file.read() print(text)
close関数が、不要になりました。
with文を使うと、自動的にオブジェクトの開放をしてくれます。
まず、これで開放漏れのミスがなくなります。
さらに、コードが見やすくなっています。
行数が減ったことに加え、コードの内容も理解しやすくなっています。
with文があることにより、オブジェクトの読み込み・接続が実施されていることがわかります。
簡単に言うと、ソースの可読性が上がります。
したがって、with文を使わないと勿体ないのです。
もし食べず嫌いなら、一度with文を味わってみてください。
以上、with文について説明しました。
次は、with文と例外処理について確認します。
with文と例外処理
先ほどは、with文のメリットを挙げました。
- オブジェクトの開放(close関数)不要→ミス防止
- ソースの可読性向上
with文には、さらにメリットが存在します。
例外発生時にノーダメージという利点があります。
Pythonにおける例外処理については、次の記事で解説しています。
まずは、with文を利用しない場合で確認しましょう。
下記コードのままだと、file1.txtが存在しない場合に例外が発生します。
file = open("file1.txt") text = "read=" + file.read() print(text) file.close()
エラー内容は、以下となります。
FileNotFoundError: [Errno 2] No such file or directory: 'file1.txt'
そして、途中で処理が止まったため、close関数が実行されていません。
つまり、オブジェクトは未開放のままということです。
これは、大変マズイです。
そのため、例外処理を加えましょう。
file = None try: file = open("file1.txt") text = "read=" + file.read() print(text) except: print("例外発生") finally: print("開放") if file is not None: file.close()
上記コードでfile1.txtが存在しない場合は、以下の結果となります。
例外発生 開放
なお、成功時は次の結果になります。
read=1 開放
file1.txtのファイルには、「1」が記載されています。
では、with文を利用している際に例外が発生したらどうなるのでしょうか?
結論から言うと、オブジェクトは自動的に開放されます。
ただし、エラーで処理は止まってしまいます。
そのため、止めないためには次のように対応します。
try: with open("file1.txt") as file: text = "read=" + file.read() print(text) except: print("例外発生")
例外処理を考慮すると、with文を使うメリットはさらに増えますね。
with文を使う場合と使わない場合とでは、コード量が倍近く異なります。
以上、with文と例外処理について説明しました。