python学習ノート-With文の役割とその原理
2689 ワード
with原理とそのコンテキストマネージャ python withの原理 with文の役割概要 with実行原理 withサポート対象 with文の自己実現01 with文の自己実現02 pythonコンテキスト管理プロトコル pythonコンテキストマネージャ(Contextor) 運転の実行原理: python withの原理
with文の役割の概要
以上のコードは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とともに作業できるのは、コンテキスト管理が組み込まれているオブジェクトのみで、現在このプロトコルをサポートしているオブジェクトは次のとおりです.
with文の自己実現01
以上の動作原理により、クラス内でenter()メソッドとexit()メソッドを独自に作成し、with文と組み合わせてクラスインスタンスを作成できます.
with文の自己実現02
pythonのcontextlibモジュールを呼び出すことでenter,exitを含むクラスを構築する必要がなくwithを使用することができ,yieldと組み合わせて使用することに注意する(現在はこの使い方しか知られていない)
pythonコンテキスト管理プロトコル
コンテキスト管理プロトコルenterとexit
pythonコンテキストマネージャ(Contextor)
コンテキストマネージャはコンテキスト管理プロトコルを実装し、Contextor呼び出し/インスタンス化すると、反復プロトコルクラス呼び出し生成反復を実装するのと同様にコンテキストマネージャが作成されます.
運転の実行原理:
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