contextlib.suppress 例外処理を無視

Python学習【365日チャレンジ!】267日目のマスターU(@Udemy11)です。

空気が乾燥して、肌がひび割れる季節になってきましたが、毎年皮膚疾患になって、ひび割れなどができてしまい、痛い思いをしています。

今年も指の関節がひび割れてきてしまったのですが、このひび割れに釣りのラインなどが入るとたまらない痛みが全身を駆け巡ります。

ラインを結ぶときは、指に何度か巻いて引っ張るわけですが、ラインが傷口にうまく入り込んでいたりすると、締め込んだ瞬間に思わず叫んでしまいます。

きちんと保湿クリームを使えばいいのですが、ついつい塗るのを忘れちゃうんですよね。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、contextlib.ContextDecoratorを学習しました。

デコレーターやwithステートメント同様に、ContextDecoratorも関数などの実行前後に何かの処理をさせることができました。

どれを使っても同じ結果が得られるので、自分のコードスタイルに合わせて最適なコードを選ぶようにしましょう。

詳細については昨日の記事をごらんください。

今日は、例外処理をスマートに処理できるcontextlib.suppressを学習します。

try-except

suppressは、例外処理に関するライブラリなので、まずは、以前学習した例外処理で出てきたtry-except文をチェックしましょう。

この記事では、リストの存在しないインデックスを指定した時にテキストを出力しましたが、今回はファイルを削除しようとしてファイルが存在しないときの処理コードを書いてみます。

import os

try:
    os.remove('test.py')
except FileNotFoundError:
    pass

作業ディレクトリには、test.pyというファイルは存在しませんのでFileNotFoundErrorが起こりますが、try-except文でエラーが起こった際に、何もしないpassを記述しているので、出力結果には何も表示されません。

contextlib.suppress

この処理と同じことがsuppressでできますので、コードを書いてみましょう。

import contextlib
import os

with contextlib.suppress(FileNotFoundError):
    os.remove('test.py')

contextlibをインポートして、withステートメントを使ってFileNotFountErrorをキャッチしています。

try-except文だと、例外が起こった際に何かをするイメージがありますが、suppressを使えばスムーズなわかりやすいコードになります。

出力結果は先ほどのコードと同じく何も出力されずにプログラムが終了します。

まとめ

suppressってどういう意味なんだろうと気になったので、調べてみました。

suppress

〔好ましくないものを力ずくで〕鎮圧する、抑圧する
・Some governments try to suppress the political freedom of their citizens. : 市民の政治的自由を抑圧する政府も、中にはある。

〔発生・発現などを〕やめさせる、抑える
・The spokesperson said that education in Japan suppresses exceptional ability in students. : その広報担当者は日本の教育が生徒の優れた能力をつぶしていると述べた。
・The government tried to suppress the journalists’ reporting. : 政府はジャーナリストたちの報道を抑えようとした。

〔事実・証拠などを〕発表しない、もみ消す、隠蔽[隠匿]する
・He couldn’t suppress the scandal. : 彼はスキャンダルをもみ消せなかった。

好ましくないものを力づくで】というところが、コードの処理とぴったりあっているような感じがしますね。

ただ、Pythonの公式ドキュメントにも記述があるのですが、suppressは例外が起こっても何の問題もないというような限定的な使い方しかしてはいけません。

本来、例外は間違っていることを知らせてくれるので、それを無視するなんて、一つ間違えば致命傷につながるわけですから。

定期検診で初期のガンが見つかっているのに無視するようなことがあってはならないのといっしょですね。

それでは、明日もGood Python!