この記事ではPythonでのwithとcontextlibの使い方を中心に、withとcontextlibの機能や使い方、注意点などをサンプル形式で詳しく紹介していますので、困っている方は参考にしてください
Python での with と contextlib の使用法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。
通常のコーディング プロセスでよく使用される with シナリオは、(ファイル処理のためにファイルを開き、その後暗黙的にファイル ハンドルのクローズを実行する) です。これらのクラスはすべて with) のサポートを提供します:
with file('test.py','r') as f : print f.readline()
with の役割は、with を適用するコンテキスト メカニズムを提供する try...finally... と似ています。ステートメントを使用する場合、クラスは 2 つの組み込み関数 __enter__ と __exit__ を提供する必要があります。前者はメインコードが実行される前に実行され、後者はメインコードが実行された後に実行されます。 as の後の変数は __enter__ 関数で返されます。次のコード スニペットとコメントを通じて、__enter__ と __exit__ の使用法を明確に理解できます。
#!encoding:utf-8 class echo : def output(self) : print 'hello world' def __enter__(self): print 'enter' return self #返回自身实例,当然也可以返回任何希望返回的东西 def __exit__(self, exception_type, exception_value, exception_traceback): #若发生异常,会在这里捕捉到,可以进行异常处理 print 'exit' #如果改__exit__可以处理改异常则通过返回True告知该异常不必传播,否则返回False if exception_type == ValueError : return True else: return False with echo() as e: e.output() print 'do something inside' print '-----------' with echo() as e: raise ValueError('value error') print '-----------' with echo() as e: raise Exception('can not detect')
実行結果:
contextlib は、with ステートメントを強化し、コンテキスト メカニズムを提供するモジュールです。ジェネレーターを通じて実装されます。クラスを定義して __enter__ と __exit__ を記述することによるコンテキスト管理は、難しくはありませんが、面倒です。 contextlib の contextmanager は、関数レベルのコンテキスト管理メカニズムを提供するデコレーターとして機能します。一般的に使用されるフレームワークは次のとおりです。
from contextlib import contextmanager @contextmanager def make_context() : print 'enter' try : yield {} except RuntimeError, err : print 'error' , err finally : print 'exit' with make_context() as value : print value
contextlib には 2 つの重要な要素もあります。1 つはネストされたもの、もう 1 つはクローズするものです。前者はネストされたコンテキストを作成するために使用され、後者は定義された close を実行するのに役立ちます。関数。しかし、with はすでに複数のコンテキストを通じて直接ネストできるため、nested は廃止されました。以下に例を示します:
from contextlib import contextmanager from contextlib import nested from contextlib import closing @contextmanager def make_context(name) : print 'enter', name yield name print 'exit', name with nested(make_context('A'), make_context('B')) as (a, b) : print a print b with make_context('A') as a, make_context('B') as b : print a print b class Door(object) : def open(self) : print 'Door is opened' def close(self) : print 'Door is closed' with closing(Door()) as door : door.open()
実行結果:
概要: Python には通常、C++ または Java のプログラミング習慣に慣れているため、これらの優れた機能を無視することがよくあります。機構。したがって、作成する Python プログラムをより Python に近づけるために、これらの Python 機能の使用方法を学ぶ必要があります。
以上がPython基本チュートリアルのwithとcontextlibの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。