C
Python/中級/Lesson 13

with文 — リソースの自動解放

15分·theory
このチャプター
5/8

with文 — リソースの自動解放

🎯 このlessonを読み終えたら

このlessonを読み終えると、以下の3つを自信を持って実践できるようになります。

  • ✅ with文が__enter__ · __exit__を呼び出す仕組み
  • ✅ @contextlib.contextmanagerデコレータ
  • ✅ exit-stackによる複数リソースの管理

学習目標をチェックリストとして手元に置き、すべてに答えられるようになったらlessonを閉じてください。

with文 — コード + 実行結果

with = リソースの自動解放 (ファイルのopen、ロック、DBコネクションなど)。__enter__ / __exit__を実行します。

1. ファイル — 最もよく使われる場面

python
# ❌ withなし — close()を忘れるとメモリリーク
f = open("memo.txt", "w", encoding="utf-8")
f.write("こんにちは")
f.close()      # 忘れやすい

# ✅ with — 自動close(例外が発生しても)
with open("memo.txt", "w", encoding="utf-8") as f:
    f.write("こんにちは")
# ブロック終了 = 自動close

2. 複数のリソースを同時に扱う

python
with open("input.txt") as 入力, open("output.txt", "w") as 出力:
    for 行 in 入力:
        出力.write(行.upper())
# 両方とも自動でclose

3. 自分で作る — __enter__ / __exit__

python
class タイマー:
    def __enter__(self):
        import time
        self.開始 = time.time()
        return self

    def __exit__(self, *args):
        import time
        かかった = time.time() - self.開始
        print(f"{かかった:.3f}秒")

with タイマー():
    sum(range(1_000_000))
# 0.020秒

4. contextmanagerデコレータ — より簡潔に

python
from contextlib import contextmanager

@contextmanager
def タイマー():
    import time
    開始 = time.time()
    yield                              # withブロックが実行される位置
    print(f"{time.time() - 開始:.3f}秒")

with タイマー():
    sum(range(1_000_000))
# 0.020秒

一行まとめ

with X() as v: ...ブロックに入るときenter、出るときexit。ファイル・ロック・トランザクションの標準パターン。

🐍 実際に試してみよう — with文 — 直接実行

上記の概念を実際にコードとして実行してみてください。値を変えながら動作を自分の目で確認するのが、最も効率的な学習方法です。
✏️ Python 코드
📟 コンソール出力
▶ 実行ボタンを押してください
🐍 Pyodideで実際のPythonを実行 — 初回は読み込みに3〜5秒

🤖 AIにこのように依頼してみよう

このlessonの概念を理解すれば、AIに具体的な指示が出せるようになります。漠然とした「直して」ではなく、語彙を持ったリクエスト — それがトークン節約の第一歩です。

  • 「このPythonコードにwith文 — リソースの自動解放の概念を適用して」
  • 「このコードにtype hint + pytestのユニットテストを追加して」
  • 「with文 — リソースの自動解放に関するPEP 8違反を確認して」

なぜトークンが減るのか

概念を知らないままAIの回答を受け取っても、「それはどういう意味ですか?」とまた聞き直す必要があります。その「聞き直し」がトークンを消費します。概念を一度学んでおけば、会話が一度で完結します。

with文 — リソースの自動解放 - Python