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ブロック
    コンテキストマネージャプロトコルは、__enter____exit__の2つの方法を含む.with文は、実行開始時にコンテキストマネージャオブジェクト上で__enter__メソッドを呼び出し、終了後に__exit__メソッドを呼び出す.__exit__の方法でfinally句の役を演じた.
    contextlibモジュールのユーティリティ
  • closing:オブジェクトがclose()メソッドを提供している場合、__enter__/__exit__プロトコルは実装されていません.この関数を使用してコンテキストマネージャを構築できます.
  • suppress:指定された例外を一時的に無視するコンテキストマネージャ
  • を構築する
  • @contextmanager:このデザイナは簡単なジェネレータ関数をコンテキストマネージャに変え、クラスを作成してマネージャプロトコルを実現する必要はありません.
  • ContextDecorator:クラスベースのコンテキストマネージャを定義するベースクラス.
  • ExitStack:このコンテキストマネージャは複数のコンテキストマネージャにアクセスできます.withブロックが終了すると、ExitStackは、スタック内の各コンテキストマネージャの__exit__メソッドを後進先出順に呼び出す.

  • @contextmanagerの使用
    このデザイナを用いるジェネレータでは、yield文の役割は、関数の定義体を2つの部分に分けることである:yield文の前のすべてのコードはwithブロックの開始時に実行され(__enter__メソッド)、yieldの後のコードはwithブロックの終了時に実行される(__exit__メソッド).