Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ カスタムコンテキストマネージャの作成 | Advanced File Handling & Context Managers
Python構造化プログラミング

カスタムコンテキストマネージャの作成

メニューを表示するにはスワイプしてください

Pythonのコンテキストマネージャの機能を最大限に活用するためには、__enter__メソッドと__exit__メソッドを実装したクラスを定義して独自のコンテキストマネージャを作成できます。__enter__メソッドはwith文のコンテキストに入る際に呼び出され、その戻り値がasの後の変数に代入されます。__exit__メソッドは、コンテキストから抜ける際(正常終了・例外発生を問わず)に呼び出されます。この設計により、リソースのセットアップとクリーンアップを安全かつ確実に行うことができ、ファイル、ネットワーク接続、ロックなどの管理に特に有用です。

__exit__メソッドは3つの引数:exc_typeexc_valuetracebackを受け取ります。これらはコンテキストブロック内で発生した例外の詳細を提供します。__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__メソッドは例外を抑制せず、クリーンアップ後に例外が伝播されます。

question mark

カスタムコンテキストマネージャにおける__exit__メソッドの役割として最も適切な説明はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  5
some-alt