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())