python学習ノート-With文の役割とその原理

2689 ワード

with原理とそのコンテキストマネージャ
  • python withの原理
  • with文の役割概要
  • with実行原理
  • withサポート対象
  • with文の自己実現01
  • with文の自己実現02
  • pythonコンテキスト管理プロトコル
  • pythonコンテキストマネージャ(Contextor)
  • 運転の実行原理:
  • python withの原理
    with文の役割の概要
    with open('a','r) as f:
        for line in f:
            print line.strip()
    

    以上のコードはwith as文を使用してファイルを操作し、ファイルを開く役割を果たします.正常であれば、ファイルの下にfを割り当て、反復器を使用してファイルの各行を遍歴し、最終遍歴が完了したらファイルを閉じます.異常が発生してもファイルは閉じられます.したがってwith文の基本的な役割:リソースの作成と解放に対する構築
    with実行原理
    withが実行されると、コンテキスト式(context_expr)を実行してコンテキストマネージャを取得します.コンテキストマネージャの役割は、with文ブロックで詳細を処理するためのコンテキストオブジェクトを提供することです.1、取得されると、そのenter()メソッドが呼び出され、with文ブロックの実行前のすべての準備機能が完了します.2、with文の後にas文が付いている場合、enter()メソッドの戻り値で値を割り当てる.3、with文ブロックが終了すると、通常終了でも異常でもコンテキストオブジェクトの__が呼び出されます.exit__()メソッド、exit()メソッドには3つのパラメータがあり、with文が正常に終了すると、3つのパラメータはすべてNoneになります.異常が発生する場合、3つのパラメータの値はそれぞれsysを呼び出すことに等しい.exc_info()関数は、タイプ(例外クラス)、値(異常インスタンス)、およびトレース記録(traceback)、対応するトレース記録オブジェクトの3つの値を返します.
    withサポート対象
    以上の原理から,任意のpythonオブジェクトに対してwith文を使用することはできず,オブジェクトはコンテキスト管理プロトコルをサポートする必要があることが分かる.すなわち、withとともに作業できるのは、コンテキスト管理が組み込まれているオブジェクトのみで、現在このプロトコルをサポートしているオブジェクトは次のとおりです.
    	file
    	decimal.Context
    	thread.LockType
    	threading.Lock
    	threading.RLock
    	threading.Condition
    	threading.Semaphore
    	threading.BoundedSemaphore
    

    with文の自己実現01
    以上の動作原理により、クラス内でenter()メソッドとexit()メソッドを独自に作成し、with文と組み合わせてクラスインスタンスを作成できます.
    class Test:
        def __enter__(self):
            print 'begin connect ...'
        
        def __exit__(self,exc_type, exc_val, exc_tb):
            print 'close connect...'
    
    if __name__ == '__main__':
        with Test() as f:
            print 'run...'
    

    with文の自己実現02
    pythonのcontextlibモジュールを呼び出すことでenter,exitを含むクラスを構築する必要がなくwithを使用することができ,yieldと組み合わせて使用することに注意する(現在はこの使い方しか知られていない)
    from contextlib import contextmanager
    
    @contextmanager
    def test():
        print 'begin connect ...'
        yield 'ddd'
        print 'close connect...'
    
    if __name__ == '__main__':
    	#   ,           
    	with test():
    		print 'a'
    		#  ,         
    	with test() as f:
    	    print f
    	    print 'a'
    

    pythonコンテキスト管理プロトコル
    コンテキスト管理プロトコルenterとexit
    pythonコンテキストマネージャ(Contextor)
    コンテキストマネージャはコンテキスト管理プロトコルを実装し、Contextor呼び出し/インスタンス化すると、反復プロトコルクラス呼び出し生成反復を実装するのと同様にコンテキストマネージャが作成されます.
    運転の実行原理:
    1、  contextor          
    2、         exit()  ,  
    3、         enter()  
    4、    as   ,  enter()              
    5、    with     
    6、          exit()   ,             ,       type、value   traceback         exit(),      None