Python の with ステートメントとコンテキスト マネージャー
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
りー
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 サイトに注目してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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