Python
 Computer >> コンピューター >  >> プログラミング >> Python

with-statementコンテキスト用のPythonユーティリティ(contextlib)


Pythonの標準ライブラリのcontextlibモジュールは、オブジェクトがプログラム内のリソースを適切に管理するContextManagerクラスを定義します。 Pythonには、コンテキストマネージャーで機能するwithキーワードがあります。ファイルオブジェクト(組み込みのopen()関数によって返される)は、ContextManagerAPIをサポートします。そのため、ファイルの操作中に使用されるキーワードをよく使用します。

次のコードブロックはファイルを開き、そこにいくつかのデータを書き込みます。操作が終了すると、ファイルが閉じられ、どのファイル記述子がリークしてファイルが破損する可能性がありますか。

f = open("file.txt","w")
f.write("hello world")
f.close()

ただし、同じファイル操作は、次の構文を使用したファイルのコンテキストマネージャー機能を使用して実行されます。

with open("file.txt","w") as f:
f.write("hello world")
print ("file is closed")

上記のように、ファイルオブジェクトはContextManagerを実装します。 withキーワードで有効になります。 withブロックには、ファイルオブジェクトに対して処理されるステートメントが含まれています。 withブロックが終了するとすぐに、ファイルオブジェクトは自動的に閉じられます(close()メソッドを明示的に呼び出す必要はありません)。ブロックの対象となるオブジェクトは、ブロック内でのみアクティブになり、ブロックの最後ですぐに破棄されます。

ContextManagerクラスには、2つの重要なメソッド__enter __()と__exit __()

があります。

__ enter __() −withブロックが開始すると呼び出されます。プログラムがこのオブジェクトに関連するランタイムコンテキストに入ったことを示します。

__ exit __() −withブロックが終了したときに呼び出されます。これは、プログラムがこのオブジェクトに関連するランタイムコンテキストを終了することを示しています。

次のインタプリタセッションで確認できるように、ファイルオブジェクトにもこれらの2つのメソッドがあります。

>>> f = open("file.txt","w")
>>> f.__enter__()
<_io.TextIOWrapper name = 'file.txt' mode = 'w' encoding = 'cp1252'>
>>> f.write("hello world")
11
>>> f.__exit__()
>>> f.write("hello world")
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
f.write("hello world")
ValueError: I/O operation on closed file.

__exit __()メソッドが呼び出されると、ファイルは閉じられます。そのため、ファイルを閉じた後にファイルにデータを書き込もうとすると、ValueErrorが表示されます。

以下に、contextManagerのより一般的な使用法を示します。まず、__ enter __()メソッドと__exit __()メソッドを使用してクラスを定義し、withステートメントを使用してそのオブジェクトのcontextManagerを有効にします。

import contextlib
class WithExample:
   def __init__(self):
      print ("object initialized")
   def __enter__(self):
      print ("entered context")
   def __exit__(self, *args):
      print ("exited context")
with WithExample() as w:
print ('this is a contextlib example')
print ('used by with statement')
print ('end of with block')

出力は、withブロックが開始するとすぐに、__ enter __()メソッドが実行されることを示しています。ブロック内のステートメントが処理されます。ブロックが終了すると、toの__exit __()メソッドが自動的に呼び出されます。

object initialized
entered context
this is a contextlib example
used by with statement
exited context
end of with block

contextlibモジュールには@contextmanagerデコレータがあり、これを使用して、ステートメントで自動的にサポートするジェネレータベースのファクトリ関数を記述できます。デコレータを使用したファイルオブジェクトのコンテキスト管理は次のとおりです-

from contextlib import contextmanager
@contextmanager
def openfile(name):
   try:
      f = open(name, 'w')
      yield f
   finally:
      f.close()
with openfile(file.txt') as f:
f.write('hello world')
print ('file is closed')

したがって、ContextManagerは、プログラム内のリソースを効果的に管理するためのPythonの非常に便利な機能です。


  1. Pythonのファイルオブジェクト?

    Pythonでは、ファイルの読み取りまたは書き込みを試みるたびに、ライブラリがネイティブに処理されるため、ライブラリをインポートする必要はありません。 最初に行うことは、組み込みのopen関数を使用してファイルオブジェクトを取得することです。 open関数はファイルを開き、ファイルオブジェクトを返します。ファイルオブジェクトには、情報を取得したり、開いたファイルを操作したりするために使用できるメソッドと属性が含まれています。 ファイルとは何ですか? ファイルに対して操作を行う前に、まずファイルとは何かを理解しましょう。ファイルは、関連情報を保存するためのディスク上の名前付きの場所です。フ

  2. Pythonのジャンクファイルオーガナイザー?

    これは、ほとんどのファイルとフォルダーを1つの場所に保持し、すべてのファイルが何であるか混乱することがあり、手動でそれを行うには怠惰すぎるPythonプログラマーにとって非常に役立つように思われるかもしれません。以下は、適切なフォルダ内のすべてを1回で整理または簡略化して、空のディレクトリを削除するPythonプログラムです。 したがって、さまざまなタイプのファイルが多数存在するディレクトリパスがあり(以下のように)、プログラムは各ファイルタイプをそれぞれのフォルダに分離します(以下のように)。 入力フォルダの構造 必要な出力 まず、さまざまなフォルダに分離するファイル