このブログでは、コンテキストマネージャープロトコル(ステートメント付き)を定義する方法について説明しましたが、今日は、より簡単な定義方法について説明します。
python
関数をコンテキストマネージャーに変えるcontextlib
こと@contextlib.contextmanager
ができるデコレーターを備えた組み込みモジュールを提供します。
import contextlib
@contextlib.contextmanager
def file_open(file_name): #此处只是模拟并没有真的打开一个文件
print("file open")
yield {
} # 把函数变为生成器
print("file end")
実際、yield
上記のロジックは前のブログの__enter__
関数(リソースの取得)のyield
ロジックと同等であり、次のロジックはそのブログの__exit__
関数(リソースの解放)と同等です。
yield
ロジックは任意です。この関数はコンテキストマネージャーになります。
次に、with
ステートメントを使用します。
with file_open("bobby.txt") as f_open: #只是模拟,说明逻辑,没有真的文件
print("file processing")
#输出为
# file open
# file processing
# file end
実行するときは、最初に__enter__
関数、つまりyield
上記のコードprintを入力しfile open
、次にprintを実行し、file processing
最後に__exit__
関数を入力します。つまり、yield
次のコードprintを実行しますfile end
。