With構文の使い方ーOpen(初期処理),Close(終了処理)の作り方

PythonでWith構文を利用すると、呼び出し側で明示的にOpen(初期処理),Close(終了処理)を呼び出さなくても自動的に実行されます。

よくあるファイルやデータベースへのアクセスで終了処理を呼び忘れてClose漏れなどを効果的に防ぐことができます。

PythonでWith構文に対応したクラスを作成するには「__enter__()」と「__exit__()」メソッドを実装します。

スポンサーリンク

PythonのWith構文の使い方

PythonでWith構文を使うと利用者に初期処理と終了処理を意識させることなく、クラス側で安全に初期処理と終了処理を確実に実行するようにできるようになります。

With構文のブロックを開始したタイミングで初期処理が、With構文のブロックを抜けたタイミングで終了処理が自動的に実行されます。

With構文に対応したクラスを作成するには「__enter__()」と「__exit__()」メソッドを実装することが必要です。

With構文__enter__と__exit__の実装方法

では実際にPythonのWith構文で必要な__enter__と__exit__メソッドを実装してみます。

今回はsqlite3のデータベースに対してのアクセスするクラスをWith構文で実装します。

ポイントは__enter__メソッドでデータベースとのコネクションを開始し、__exit__メソッドでデータベースとのコネクションを終了しています。

このクラスを利用する場合は

のように「with」で利用するクラス名を指定し、そのインスタンス名を「as」で指定します。

上記のソースを実行すると

となり、「__enter__ → withブロック内 → __exit__」と処理が実行されいることがわかります。

With構文で例外が発生した場合

万が一With構文で例外が発生した場合でも、きちんと__exit__メソッド(終了処理)が呼び出されます。

以下では「SELECT」でワザとエラーが発生するようにしてあります。

上記のソースを実行すると

となり、途中で例外が発生しても__exit__メソッド(終了処理)がコールされています。

まとめ

With構文を利用すれば、呼び出し側にOpen(初期処理)やClose(終了処理)を意識させることなく、安全に実行することができるようになります。

With構文に対応したクラスを作成するには「__enter__()」と「__exit__()」メソッドを実装することが必要です。

以上、With構文の使い方ーOpen(初期処理),Close(終了処理)の作り方でした。

タイトルとURLをコピーしました