カスタムコンテキストマネージャの作成
メニューを表示するにはスワイプしてください
Pythonのコンテキストマネージャの機能を最大限に活用するためには、__enter__メソッドと__exit__メソッドを実装したクラスを定義して独自のコンテキストマネージャを作成できます。__enter__メソッドはwith文のコンテキストに入る際に呼び出され、その戻り値がasの後の変数に代入されます。__exit__メソッドは、コンテキストから抜ける際(正常終了・例外発生を問わず)に呼び出されます。この設計により、リソースのセットアップとクリーンアップを安全かつ確実に行うことができ、ファイル、ネットワーク接続、ロックなどの管理に特に有用です。
__exit__メソッドは3つの引数:exc_type、exc_value、tracebackを受け取ります。これらはコンテキストブロック内で発生した例外の詳細を提供します。__exit__がTrueを返すと例外が抑制され、それ以外の場合はクリーンアップ後に例外が伝播します。これらのメソッドを実装することで、リソースのセットアップとクリーンアップのロジックを正確に制御でき、コードの堅牢性と保守性が向上します。
class FileLogger:
def __init__(self, filename, logname):
self.filename = filename
self.logname = logname
self.file = None
self.log = None
def __enter__(self):
self.file = open(self.filename, "r")
self.log = open(self.logname, "a")
self.log.write(f"Opened file: {self.filename}\n")
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
self.log.write(f"Closed file: {self.filename}\n")
if self.log:
self.log.close()
# Do not suppress exceptions
return False
次のコードは、カスタムコンテキストマネージャクラスFileLoggerの例です。このクラスは、対象ファイルを読み込み用に、ログファイルを追記用に開くよう設計されています。コンテキスト(with文)に入ると、ファイルのオープンイベントをログに記録します。コンテキストから抜ける際(正常終了・例外発生を問わず)、ファイルのクローズイベントをログに記録し、両方のファイルを確実に閉じます。__exit__メソッドは例外を抑制せず、クリーンアップ後に例外が伝播されます。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください