Closed3

Python3_with文とコンテキストマネージャー

かじるかじる

Python実践レシピより

Python3エンジニア認定実践試験メモ

with文

main.py
# with文
with open("hoge.txt") as f:
    print(f.read())
# Hello, python3!!

# with文を使わない場合
f = None
try:
    f = open("hoge.txt")
    print(f.read())
finally:
    if f: 
        f.close()
# Hello, python3!!
かじるかじる

コンテキストマネージャーを使う

main.py
# コンテキストマネージャーを作る
class MyContextManager:

    def __init__(self, file_name):
        self.file_name = file_name

    def __enter__(self):
        print("__enter__: ファイルを開きます")
        self.file_obj = open(self.file_name)
        return self.file_obj

    def __exit__(self, type, value, traceback):
        print("__exit__: ファイルを閉じます")
        self.file_obj.close()

# コンテキストマネージャーを使う
with MyContextManager("hoge.txt") as f:
    print(f.read())

# __enter__: ファイルを開きます
# Hello, python3!!
# __exit__: ファイルを閉じます
かじるかじる

コンテキストマネージャーを使う(デコレーター)

main.py
import contextlib
import traceback

# コンテキストマネージャーを作る(デコレーター)
@contextlib.contextmanager
def my_open_context_manager(file_name):
    file_obj = open(file_name)
    try:
        print("__enter__: ファイルを開きます")
        yield file_obj
    except Exception as e:
        print(f"__exit__: {type(e)}")
        print(f"__exit__: {e}")
        print(f"__exit__: {list(traceback.TracebackException.from_exception(e).format())}")
        raise
    finally:
        print("__exit__: ファイルを閉じます")
        file_obj.close()

# コンテキストマネージャーを使う
with my_open_context_manager("hoge.txt") as f:
    print(f.read())

# __enter__: ファイルを開きます
# Hello, python3!!
# __exit__: ファイルを閉じます
このスクラップは2ヶ月前にクローズされました