Skip to content

with文に対応するクラスの定義#

【Python】with文の構造を理解する

  • with文で利用できるClassを作成するには__enter__メソッドと__exit__メソッドを実装する
  • __enter__は、with文で利用されるオブジェクトの処理の前処理を行う
  • __exit__は後処理を行う
  • __exit__ には3つの引数を持たせることができる
  • exc_type: 例外の型
  • exc_value: 例外の値
  • traceback: 例外のtraceback
class FileReader:
    def __init__(self, filename):
        print('init')
        self.filename = filename
        self.file = None

    def __enter__(self):
        """ with文で最初に呼ばれる処理 """
        print('enter')
        self.file = open(self.filename, 'r')
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        """ withブロックから抜ける時の処理 """
        print(f'exit: {exc_type}, {exc_value}, {traceback}')
        self.file.close()
    # エラー処理実装のパターンs
    # def __exit__(self, exc_type, exc_value, tb):
    #     if exc_type is not None:
    #         print('エラーが発生しました')
    #         for message in traceback.format_exception(exc_type, exc_value, tb):
    #             print(message)
    #     self.file.close()


if __name__ == '__main__':
    with FileReader('test.txt') as f:
        print(f.read())