Python コンテキストマネージャ
Python のコンテキストマネージャは広く使用されていますが、その使用目的を理解している人はほとんどいません。ファイル読み書きで一般的に使用されるこれらのステートメントは、特定のプロセスでのみリソースが使用されることを保証することで、アプリケーションがシステムメモリを節約し、リソース管理を改善するのに役立ちます。
with ステートメント
コンテキストマネージャとは、コンテキスト(コードブロック)の開始時と終了時に通知を受けるオブジェクトのことです。通常、withステートメントと共に使用されます。これは通知の処理を担当します。
例えば、ファイルオブジェクトはコンテキストマネージャです。コンテキストが終了すると、ファイルオブジェクトは自動的に閉じられます。
# コンテキストマネージャ:リソースのクリーンアップを自動的に処理
# 'with'ブロックを抜けるときにファイルは自動的に閉じられる
with open(filename) as f: # 'f' はファイルオブジェクト
file_contents = f.read()
# エラーが発生した場合でも、ここでファイルは自動的に閉じられる
クイズ
ログインしてこのクイズに回答し、学習の進捗を追跡できます
コンテキストマネージャ(
withステートメント)を使用する主な利点は何ですか?A. エラーが発生した場合でも、リソースのクリーンアップを自動的に処理する
B. コードの実行速度を向上させる
C. 複数のファイルを同時に開くことができる
D. すべてのエラーを防ぐ
ブロックの実行が終了するものは何でも、コンテキストマネージャの終了メソッドが呼び出されます。これには例外が含まれ、エラーによって開いているファイルや接続から予期せず終了する場合に役立ちます。ファイルを閉じたり接続を切断したりせずにスクリプトを終了するのは悪い考えであり、データ損失やその他の問題を引き起こす可能性があります。コンテキストマネージャを使用することで、このようにして損害や損失を防ぐための予防措置が常に取られることを保証できます。
独自のコンテキストマネージャの記述
contextlib.contextmanagerデコレータのおかげで、ジェネレータ構文を使用してコンテキストマネージャを記述することも可能です。
# contextlib デコレータを使用した関数ベースのコンテキストマネージャ
import contextlib
@contextlib.contextmanager
def context_manager(num):
print('Enter') # yield の前のコードは__enter__で実行される
yield num + 1 # yield された値が'cm'変数になる
print('Exit') # yield の後のコードは__exit__で実行される
with context_manager(2) as cm: # cm は yield された値 (3) を受け取る
print('Right in the middle with cm = {}'.format(cm))
Enter
Right in the middle with cm = 3
Exit
クラスベースのコンテキストマネージャ
クラスベースのコンテキストマネージャを定義できます。主要なメソッドは__enter__と__exit__です。
# クラスベースのコンテキストマネージャ:__enter__および__exit__メソッドを実装する
class ContextManager:
def __enter__(self, *args, **kwargs): # 'with'ブロックに入るときに呼び出される
print("--enter--")
return self # 'as'変数として使用するオブジェクトを返すことができる
def __exit__(self, *args): # 'with'ブロックを抜けるときに呼び出される
print("--exit--")
with ContextManager(): # 終了時に__enter__が呼び出され、次に__exit__が呼び出される
print("test")
--enter--
test
--exit--
クイズ
ログインしてこのクイズに回答し、学習の進捗を追跡できます
クラスがコンテキストマネージャとして使用されるために実装しなければならないメソッドは何ですか?
A.
**init** および **del**B.
**enter** および **exit**C.
open および closeD.
start および stop