キーワード「with」とコンテキストマネージャーの詳細説明
ソース コードを読む習慣がある場合は、優れたコードの中に "with" キーワードを含むステートメントが頻繁に出現するのを目にすることがありますが、これは通常どのようなシナリオで使用されますか?今日は with およびコンテキスト マネージャーについて話しましょう。
ファイル、データベース接続、ソケットなどのシステム リソースの場合、アプリケーションがこれらのリソースを開いてビジネス ロジックを実行した後に行う必要があることの 1 つは、リソースを閉じる (切断する) ことです。
たとえば、Python プログラムはファイルを開き、コンテンツをファイルに書き込みます。書き込み後、ファイルを閉じる必要があります。そうしないとどうなりますか?極端な場合、システムが開くことを許可するファイルの最大数が制限されているために、「開いているファイルが多すぎます」エラーが発生することがあります。
同様に、データベースについても、接続が多すぎて時間内に閉じられない場合、「MySQLサーバーに接続できません。接続が多すぎます」というメッセージが表示されることがあります。データベース接続は非常に高価なリソースであり、使用できないためです。それらがなければ制限が生まれます。
ファイルを正しく閉じる方法を見てみましょう。
通常バージョン:
def m1(): f = open("output.txt", "w") f.write("python之禅") f.close()
このように書くと潜在的な問題が発生し、write の呼び出し中に例外が発生し、後続のコードの実行を続行できない場合、close メソッドを正常に呼び出すことができないため、リソースが停止します。常にプログラムの占有者が解放されます。では、どうすればコードを改善できるでしょうか?
上級バージョン:
def m2(): f = open("output.txt", "w") try: f.write("python之禅") except IOError: print("oops error") finally: f.close()
プログラムの改良バージョンでは、try/finally ステートメントを使用して、例外が発生する可能性のあるコードのキャプチャを試行します。つまり、try コード ブロック内のプログラムで例外が発生した場合に、の場合、後続のコードは実行されず、例外コード ブロックに直接ジャンプします。何があっても、finally ブロック内のコードは最終的に実行されます。したがって、finally コードに close が配置されている限り、ファイルは確実に閉じられます。
プレミアム バージョン:
def m3(): with open("output.txt", "r") as f: f.write("Python之禅")
より簡潔でエレガントな方法は、 with キーワードを使用することです。 open メソッドの戻り値は変数 f に割り当てられます。with コード ブロックを終了すると、システムは自動的に f.close() メソッドを呼び出します。with の機能は try/finally ステートメントを使用するのと同じです。それでは、その実装原理は何でしょうか? with の原則について説明する前に、コンテキスト マネージャーという別の概念について説明する必要があります。
コンテキスト マネージャーenter() メソッドと exit() メソッドを実装するあらゆる オブジェクト をコンテキスト マネージャーと呼ぶことができ、コンテキスト マネージャー オブジェクトは with キーワードを使用できます。明らかに、ファイル オブジェクトもコンテキスト マネージャーを実装します。
それでは、ファイル オブジェクトはこれら 2 つのメソッドをどのように実装するのでしょうか?独自のファイル クラスの実装をシミュレートし、そのクラスにenter() メソッドと exit() メソッドを実装させることができます。
class File(): def init(self, filename, mode): self.filename = filename self.mode = mode def enter(self): print("entering") self.f = open(self.filename, self.mode) return self.f def exit(self, *args): print("will exit") self.f.close()
enter() メソッドは、開こうとしているファイル オブジェクトであるリソース オブジェクトを返し、exit() メソッドはいくつかのクリーンアップ作業を処理します。
File クラスはコンテキスト マネージャーを実装しているため、with ステートメントを使用できるようになりました。with File('out.txt', 'w') as f: print("writing") f.write('hello, python')
関数は、yieldによって2つの部分に分割され、yieldの前のステートメントはenterメソッドで実行され、yieldの後のステートメントはexitメソッドで実行されます。 yield の直後の値が関数の戻り値になります。
from contextlib import contextmanager @contextmanager def my_open(path, mode): f = open(path, mode) yield f f.close()
with my_open('out.txt', 'w') as f: f.write("hello , the simplest context manager")
以上がキーワード「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)

ホットトピック











LinuxターミナルでPythonバージョンを表示する際の許可の問題の解決策PythonターミナルでPythonバージョンを表示しようとするとき、Pythonを入力してください...

PythonのPandasライブラリを使用する場合、異なる構造を持つ2つのデータフレーム間で列全体をコピーする方法は一般的な問題です。 2つのデータがあるとします...

Pythonパラメーター注釈の代替使用Pythonプログラミングでは、パラメーターアノテーションは、開発者が機能をよりよく理解して使用するのに役立つ非常に便利な機能です...

Pythonクロスプラットフォームデスクトップアプリケーション開発ライブラリの選択多くのPython開発者は、WindowsシステムとLinuxシステムの両方で実行できるデスクトップアプリケーションを開発したいと考えています...

Pythonスクリプトは、特定の場所のカーソル位置への出力をどのようにクリアしますか? Pythonスクリプトを書くときは、以前の出力をカーソル位置にクリアするのが一般的です...

なぜ私のコードはAPIによってデータを返しているのですか?プログラミングでは、APIが呼び出すときにヌル値を返すという問題に遭遇することがよくあります。

UvicornはどのようにしてHTTPリクエストを継続的に聞きますか? Uvicornは、ASGIに基づく軽量のWebサーバーです。そのコア機能の1つは、HTTPリクエストを聞いて続行することです...

多くの開発者はPypi(PythonPackageIndex)に依存しています...
