ホームページ  >  記事  >  バックエンド開発  >  Python基本チュートリアルのwithとcontextlibの使用例を詳しく解説

Python基本チュートリアルのwithとcontextlibの使用例を詳しく解説

巴扎黑
巴扎黑オリジナル
2017-08-09 11:02:251602ブラウズ

この記事では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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。