目次
Pythonのwithの役割
開始処理とセットになっている終了処理を自動的に呼び出してくれる仕組みだ。
具体的には__enter__関数をwithブロックに入るときに実行し、__exit__関数をwithブロックが終わったときに実行します。
Pythonのwith文の形式
処理1が開始して、そのあとに処理2が開始する。処理1の終了処理をwithブロックが終わるときに実行される。
withブロック開始時に、処理1が返したオブジェクトの__enter__を実行し、withブロック終了時に処理1が返したオブジェクトの__exit__を実行します。
with 処理1の関数 as 関数の戻り値:
処理2
例えば、ファイル扱う場合はこんな感じ。withブロックが終わるとfileを自動でcloseしてくれる。
with open('testfile.txt', 'r') as file:
print(file.read())
with文が使えるような自作クラスのサンプルコード
先ほども記載しましたが、__enter__関数をwithブロックに入るときに実行し、__exit__関数をwithブロックが終わったときに実行します。
なので、__enter__, __exit__関数をオーバーライドすればwith文を自作クラスで使うことができます。
__enter__関数はwithブロック開始したときに実行されるので前処理的な処理を、__exit__関数はwithブロック終了時に実行されるので後処理的なイメージです。
以下のサンプルコードは実行すると with start, with block, with close と出力されます。
with文開始時に__enter__に実装したwith startが出力され、次にwithブロック中のprint(“with block”)が実行され、withブロック終了時に__exit__に実装したwith closeが出力されます。
class WithSample:
def __enter__(self):
print("with start")
def __exit__(self, exc_type, exc_val, exc_tb):
print("with close")
def create_with_sample():
return WithSample()
with create_with_sample() as cs:
print("with block")