chapter 15コンテキストマネージャとelseブロック
1219 ワード
主なディスカッション: with文とコンテキストマネージャ for、while、try文のelse句 if文以外のelseブロック
else句はif文のみならずfor,while,try文でも使用できる. for:forループの実行が完了するときのみelseブロックを実行する. while:whileループが条件が偽値であるため終了した場合にのみelseブロックが実行する. try:tryブロックに異常放出がない場合にのみelseブロックを実行する.
コンテキストマネージャとwithブロック
コンテキストマネージャプロトコルは、
contextlibモジュールのユーティリティ closing:オブジェクトがclose()メソッドを提供している場合、 suppress:指定された例外を一時的に無視するコンテキストマネージャ を構築する@contextmanager:このデザイナは簡単なジェネレータ関数をコンテキストマネージャに変え、クラスを作成してマネージャプロトコルを実現する必要はありません. ContextDecorator:クラスベースのコンテキストマネージャを定義するベースクラス. ExitStack:このコンテキストマネージャは複数のコンテキストマネージャにアクセスできます.withブロックが終了すると、ExitStackは、スタック内の各コンテキストマネージャの
@contextmanagerの使用
このデザイナを用いるジェネレータでは、yield文の役割は、関数の定義体を2つの部分に分けることである:yield文の前のすべてのコードはwithブロックの開始時に実行され(
else句はif文のみならずfor,while,try文でも使用できる.
コンテキストマネージャとwithブロック
コンテキストマネージャプロトコルは、
__enter__
と__exit__
の2つの方法を含む.with文は、実行開始時にコンテキストマネージャオブジェクト上で__enter__
メソッドを呼び出し、終了後に__exit__
メソッドを呼び出す.__exit__
の方法でfinally句の役を演じた.contextlibモジュールのユーティリティ
__enter__/__exit__
プロトコルは実装されていません.この関数を使用してコンテキストマネージャを構築できます.__exit__
メソッドを後進先出順に呼び出す.@contextmanagerの使用
このデザイナを用いるジェネレータでは、yield文の役割は、関数の定義体を2つの部分に分けることである:yield文の前のすべてのコードはwithブロックの開始時に実行され(
__enter__
メソッド)、yieldの後のコードはwithブロックの終了時に実行される(__exit__
メソッド).