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

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

Aug 09, 2017 am 11:02 AM
python with

この記事では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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonインタープリターはLinuxシステムで削除できますか? PythonインタープリターはLinuxシステムで削除できますか? Apr 02, 2025 am 07:00 AM

Linux Systemsに付属するPythonインタープリターを削除する問題に関して、多くのLinuxディストリビューションは、インストール時にPythonインタープリターをプリインストールし、パッケージマネージャーを使用しません...

Pythonでのカスタムデコレータのパイランスタイプ検出の問題を解決する方法は? Pythonでのカスタムデコレータのパイランスタイプ検出の問題を解決する方法は? Apr 02, 2025 am 06:42 AM

Pythonプログラミングでカスタムデコレーターを使用する場合、Pylance Type検出問題解決策デコレーターは、行を追加するために使用できる強力なツールです...

Python 3.6のロードピクルスファイルエラーmodulenotfounderror:ピクルスファイル「__builtin__」をロードした場合はどうすればよいですか? Python 3.6のロードピクルスファイルエラーmodulenotfounderror:ピクルスファイル「__builtin__」をロードした場合はどうすればよいですか? Apr 02, 2025 am 06:27 AM

Python 3.6のピクルスファイルの読み込みエラー:modulenotfounderror:nomodulenamed ...

FastapiとAIOHTTPは同じグローバルイベントループを共有していますか? FastapiとAIOHTTPは同じグローバルイベントループを共有していますか? Apr 02, 2025 am 06:12 AM

Pythonの非同期ライブラリ間の互換性の問題Python、非同期プログラミングは、高い並行性とI/Oのプロセスになりました...

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

Pythonの信号を介して親プロセスを殺した後に子プロセスも終了することを確認する方法は? Pythonの信号を介して親プロセスを殺した後に子プロセスも終了することを確認する方法は? Apr 02, 2025 am 06:39 AM

子どものプロセスを使用して親プロセスを殺すときに実行され続ける子プロセスの問題と解決策。 Pythonプログラミングでは、信号を通じて親のプロセスを殺した後、子のプロセスはまだ...

See all articles