PythonTweetこんにちは、とりゅふです。みなさん、Pythonでファイルを読み込みする時って普段どのように書きますか?私ならこんな感じで書きます。f.read()print(text)withを使ってファイルを開き、中のテキストを取り出し、printするプログラムです。このwith、何者か説明できますか?今回はこのwith構文についてまとめました。3.7.6で実行しています。LubanovicオライリージャパンAmazonwith構文の正体まずこのwith構文の正体について見ていきましょう。withは前処理と後処理を実行してくれる構文です。前処理と後処理が必要な処理って必ずありますよね。ファイルのOpen、Closeだったり、データベースの接続、切断だったり、これらは主処理の前後に前処理と後処理が実行される処理になります。open('text.csv')のように、ファイルの読み込みでwithを使った場合、内部的には以下のような処理になります。f.read()print(txt)f.close()open()してread()するまでは良いのですが、close()するの忘れそうになりませんか?ファイルをcloseし忘れて、他の処理がファイルにアクセスできなくなったり、無駄なリソースを使い続けたままになったりと、バグの元になりがちですよね。with構文を使えば、このopen()、close()を意識することなく処理が書けるので、より品質の高いコードを書くことができるのです。withを使えるクラスwith構文で呼び出しができるクラスは、__enter__()と、__exit__()を実装したクラスになります。以下のようなクラスです。通常のクラスのように、__init__()が実行され、その次に前処理として__enter__()が実行されます。ここでreturnしたオブジェクトが、with構文のasに当たるオブジェクトになります。ここではwith構文内でWithSampleクラスの処理を実行したいので、selfを返すようにしています。withブロック内で主処理を実行し、withブロックから抜ける時に、後処理として__exit__()が実行されます。ちなみにですが、__enter__()と、__exit__()のいずれかが実装されていないクラスをwith構文で呼び出そうとすると、AttributeErrorとなります。出入口は必須ってことですね。次は例外発生時の検証として、以下のようなわり算だけができる電卓クラスを作り、わざとZeroDevisionErrorを発生させてみます。print('計算を開始します。print('計算を終了します。**計算を開始します。=5.0計算を終了します。**計算を開始します。=[ERROR]計算を終了します。zero1回目の計算機は最後まで正常に処理され、2回目の計算機は、途中でZeroDivisionErrorが発生していますが、ちゃんと__exit__()の処理は実行されていることがわかります。finallyなどを用いずに、後処理を実行してくれます。ファイルをOpenして、その間に例外が発生しても、ちゃんとcloseはされます。まとめ以上、今回はPythonのwith構文についてまとめました。自分で定義したクラスで、前処理、後処理が必要な処理については、__enter__()と、__exit__()を実装し、with構文で呼び出しができるようにすれば、呼び出しが簡単で、品質の高いプログラムにつながると思います。APIをサクッと作成してみるこんにちは、今回はPythonのWebフレームワークFlaskを用いて、W...2022-03-09TypeScriptはじめました皆さん、JavaScriptはお好きですか?僕は苦手です。僕は...2021-11-22【Python入門】Pythonのロギングと真剣に向き合うこんにちは、将来の夢が最近「ログハウスのサウナ小屋を建てた...2021-08-23【Python入門】コメントとdocstring本日はPython入門記事です。はてなブログPro都内でGCP、Python使ったデータエンジニアやってます。クラウドでの設計~開発・運用まで全部やります。20代文系エンジニアです。GCP、Python中心に、データエンジニアとして学んでいる技術をご紹介する記事を書いています。BigQueryとAirflowとバイクと鳥が好き。アイコンはたまたまお魚を加えていたときのカワセミさん。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。