ホームページ バックエンド開発 Python チュートリアル Python の with ステートメントとコンテキスト マネージャー

Python の with ステートメントとコンテキスト マネージャー

Mar 01, 2017 pm 02:15 PM

Python のコンテキスト マネージャー オブジェクトとして、with ステートメントを使用できます。コンテキスト マネージャーを提供する contextlib モジュールの使用は、Python プログラミングの高度なスキルです。Python での with ステートメントとコンテキスト マネージャーの学習を詳しく見てみましょう。概要:

0. コンテキストマネージャーについて
コンテキストマネージャーは with ステートメントで使用できるオブジェクトであり、__enter__ メソッドと __exit__ メソッドがあります。

with manager as var:
  do_something(var)
ログイン後にコピー

は、次の簡略化に相当します。

var = manager.__enter__()
try:
  do_something(var)
finally:
  manager.__exit__()
ログイン後にコピー

つまり、PEP 343 で定義されているコンテキスト マネージャー プロトコルを使用すると、退屈な try...excited...finally 構造を単一の構造に抽象化できます。クラスには、懸念される do_something の部分だけが残ります。

__enter__ メソッドが最初に呼び出されます。 var に割り当てられた値を返すことができます。 as 部分はオプションです。これが表示されない場合、enter の戻り値は単に無視されます。
with ステートメントの下のコードが実行されます。 try 句と同様に、これらは正常に実行されるか、中断、継続、または戻るか、または例外をスローする可能性があります。どちらの場合も、ブロックが終了すると、__exit__ メソッドが呼び出されます。例外がスローされた場合、例外情報は __exit__ に渡されます。これについては次のセクションで説明します。通常、例外は、finally 句のように無視でき、__exit__ の終了後に再スローされます。
書き込み操作が完了した直後にファイルが閉じられるようにしたいとします:

>>> class closing(object):
...  def __init__(self, obj):
...   self.obj = obj
...  def __enter__(self):
...   return self.obj
...  def __exit__(self, *args):
...   self.obj.close()
>>> with closing(open('/tmp/file', 'w')) as f:
...  f.write('the contents\n')
ログイン後にコピー

ここでは、with ブロックが終了するときに f.close() が呼び出されることを確認します。ファイルを閉じることは非常に一般的な操作であるため、このサポートはファイル クラスにすでに存在しています。これには、close を呼び出し、コンテキスト マネージャー自体として機能する __exit__ メソッドがあります。

>>> with open('/tmp/file', 'a') as f:
...  f.write('more contents\n')
ログイン後にコピー

try...finally の一般的な使用法は、リソースを解放することです。さまざまな状況は同様に実装されます。リソースは __enter__ フェーズで取得され、 __exit__ フェーズで解放され、例外がスローされた場合には例外も渡されます。ファイル操作と同様、これは多くの場合、オブジェクトを使用した後の自然な操作であり、組み込みのサポートによって便利になります。バージョンが上がるごとに、Python がサポートされる場所が増えています。

1. コンテキストマネージャーの使用方法:

ファイルを開いて「hello world」を書き込む方法

filename="my.txt"
mode="w"
writer=open(filename,mode)
writer.write("hello world")
writer.close()
ログイン後にコピー

例外が発生した場合(ディスクがいっぱいであるなど)、チャンスはありません。ステップ 5 を実行します。OK。もちろん、パッケージ化に try-finally ステートメント ブロックを使用できます:

writer=open(filename,mode)
try:
  writer.write("hello world")
finally:
  writer.close()
ログイン後にコピー

複雑な操作を実行すると、try-finally ステートメントは醜くなり、with ステートメントを使用して書き換えられます:

with open(filename,mode) as writer:
  writer.write("hello world")
ログイン後にコピー

as は、open() 関数から返されたコンテンツを参照し、それを新しい値に割り当てます。 with は try-finally のタスクを完了します。

2. カスタム コンテキスト マネージャー

with ステートメントは try-finally に似ており、コンテキスト メカニズムを提供します。 with ステートメントを適用するには、クラスで 2 つの組み込み関数 __enter__ と __exit__ を提供する必要があります。前者はメインコードが実行される前に実行され、後者はメインコードが実行された後に実行されます。 as の後の変数は __enter__ 関数で返されます。

class echo():
  def output(self):
    print "hello world"
  def __enter__(self):
    print "enter"
    return self #可以返回任何希望返回的东西
  def __exit__(self,exception_type,value,trackback):
    print "exit"
    if exception_type==ValueError:
      return True
    else:
      return Flase
 
>>>with echo as e:
  e.output()
ログイン後にコピー


出力:

enter
hello world
exit
ログイン後にコピー

完全な __exit__ 関数は次のとおりです:

def __exit__(self,exc_type,exc_value,exc_tb)
ログイン後にコピー

その中で、exc_type: exc_value:例外値; exc_tb: 例外の追跡情報

__exit__ が True を返す場合、例外は伝播されません

3. contextlib モジュール

contextlib モジュールの役割は、Generator を通じて実装される、使いやすいコンテキスト マネージャーを提供することです。 contextlib の contextmanager は、関数レベルのコンテキスト管理メカニズムを提供するデコレーターとして機能します。一般的に使用されるフレームワークは次のとおりです。

from contextlib import contextmanager
@contextmanager
def make_context():
  print 'enter'
  try:
    yield "ok"
  except RuntimeError,err:
    print 'error',err
  finally:
    print 'exit'
    
>>>with make_context() as value:
  print value
ログイン後にコピー


出力は次のとおりです。 try-finally として記述されます。例外の安全性を確保する (例外を処理できる) ため、as の後の変数の値が yield によって返されます。 yield より前のステートメントはコード ブロックが実行される前の操作とみなすことができ、yield の後の操作は __exit__ 関数内の操作とみなすことができます。

スレッドロックを例に挙げます:

  enter
  ok
  exit
ログイン後にコピー

4. contextlib.nested: ネストを減らす

対象:

@contextlib.contextmanager
def loudLock():
  print 'Locking'
  lock.acquire()
  yield
  print 'Releasing'
  lock.release()
 
with loudLock():
  print 'Lock is locked: %s' % lock.locked()
  print 'Doing something that needs locking'
 
#Output:
#Locking
#Lock is locked: True
#Doing something that needs locking
#Releasing
ログイン後にコピー

はcontextlib.nestedで簡素化できます:

りー

Python 2.7 以降では、新しい構文に置き換えられます:

with open(filename,mode) as reader:
  with open(filename1,mode1) as writer:
    writer.write(reader.read())
ログイン後にコピー

5, contextlib.closed()

ファイル クラスはコンテキスト マネージャー API を直接サポートしていますが、一部のオブジェクトはオープン ハンドルを表します サポートされていませんurllib.urlopen() によって返されるオブジェクトなど。 close() メソッドを使用するが、コンテキスト マネージャー API をサポートしていないレガシー クラスもいくつかあります。ハンドルが確実に閉じられるようにするには、closed() (クラスの close メソッドを呼び出す) を使用してハンドルのコンテキスト マネージャーを作成する必要があります。

with contextlib.nested(open(filename,mode),open(filename1,mode1)) as (reader,writer):
  writer.write(reader.read())
ログイン後にコピー

出力:

with open(filename,mode) as reader,open(filename1,mode1) as writer:
  writer.write(reader.read())
ログイン後にコピー



Python の with ステートメントとコンテキスト マネージャーに関連するその他の記事については、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を使用してテキストファイルのZIPF配布を見つける方法 Pythonを使用してテキストファイルのZIPF配布を見つける方法 Mar 05, 2025 am 09:58 AM

このチュートリアルでは、Pythonを使用してZIPFの法則の統計的概念を処理する方法を示し、法律の処理時にPythonの読み取りおよび並べ替えの効率性を示します。 ZIPF分布という用語が何を意味するのか疑問に思うかもしれません。この用語を理解するには、まずZIPFの法律を定義する必要があります。心配しないでください、私は指示を簡素化しようとします。 ZIPFの法則 ZIPFの法則は単に意味します。大きな自然言語のコーパスでは、最も頻繁に発生する単語は、2番目の頻繁な単語のほぼ2倍の頻度で表示されます。 例を見てみましょう。アメリカ英語の茶色のコーパスを見ると、最も頻繁な言葉は「thであることに気付くでしょう。

HTMLを解析するために美しいスープを使用するにはどうすればよいですか? HTMLを解析するために美しいスープを使用するにはどうすればよいですか? Mar 10, 2025 pm 06:54 PM

この記事では、Pythonライブラリである美しいスープを使用してHTMLを解析する方法について説明します。 find()、find_all()、select()、およびget_text()などの一般的な方法は、データ抽出、多様なHTML構造とエラーの処理、および代替案(SEL

Pythonでファイルをダウンロードする方法 Pythonでファイルをダウンロードする方法 Mar 01, 2025 am 10:03 AM

Pythonは、インターネットからファイルをダウンロードするさまざまな方法を提供します。これは、urllibパッケージまたはリクエストライブラリを使用してHTTPを介してダウンロードできます。このチュートリアルでは、これらのライブラリを使用してPythonからURLからファイルをダウンロードする方法を説明します。 ライブラリをリクエストします リクエストは、Pythonで最も人気のあるライブラリの1つです。クエリ文字列をURLに手動で追加したり、POSTデータのエンコードをフォームに追加せずに、HTTP/1.1リクエストを送信できます。 リクエストライブラリは、以下を含む多くの機能を実行できます フォームデータを追加します マルチパートファイルを追加します Python応答データにアクセスします リクエストを行います 頭

Pythonでの画像フィルタリング Pythonでの画像フィルタリング Mar 03, 2025 am 09:44 AM

ノイズの多い画像を扱うことは、特に携帯電話や低解像度のカメラの写真でよくある問題です。 このチュートリアルでは、OpenCVを使用してPythonの画像フィルタリング手法を調査して、この問題に取り組みます。 画像フィルタリング:強力なツール 画像フィルター

Pythonを使用してPDFドキュメントの操作方法 Pythonを使用してPDFドキュメントの操作方法 Mar 02, 2025 am 09:54 AM

PDFファイルは、クロスプラットフォームの互換性に人気があり、オペレーティングシステム、読み取りデバイス、ソフトウェア間でコンテンツとレイアウトが一貫しています。ただし、Python Plansing Plain Text Filesとは異なり、PDFファイルは、より複雑な構造を持つバイナリファイルであり、フォント、色、画像などの要素を含んでいます。 幸いなことに、Pythonの外部モジュールでPDFファイルを処理することは難しくありません。この記事では、PYPDF2モジュールを使用して、PDFファイルを開き、ページを印刷し、テキストを抽出する方法を示します。 PDFファイルの作成と編集については、私からの別のチュートリアルを参照してください。 準備 コアは、外部モジュールPYPDF2を使用することにあります。まず、PIPを使用してインストールします。 ピップはpです

DjangoアプリケーションでRedisを使用してキャッシュする方法 DjangoアプリケーションでRedisを使用してキャッシュする方法 Mar 02, 2025 am 10:10 AM

このチュートリアルでは、Redisキャッシングを活用して、特にDjangoフレームワーク内でPythonアプリケーションのパフォーマンスを向上させる方法を示しています。 Redisのインストール、Django構成、およびパフォーマンスの比較をカバーして、Beneを強調します

Natural Language Toolkit(NLTK)の紹介 Natural Language Toolkit(NLTK)の紹介 Mar 01, 2025 am 10:05 AM

自然言語処理(NLP)は、人間の言語の自動または半自動処理です。 NLPは言語学と密接に関連しており、認知科学、心理学、生理学、数学の研究とのリンクがあります。コンピューターサイエンスで

TensorflowまたはPytorchで深い学習を実行する方法は? TensorflowまたはPytorchで深い学習を実行する方法は? Mar 10, 2025 pm 06:52 PM

この記事では、深い学習のためにTensorflowとPytorchを比較しています。 関連する手順、データの準備、モデルの構築、トレーニング、評価、展開について詳しく説明しています。 特に計算グラップに関して、フレームワーク間の重要な違い

See all articles