← クエスト一覧

クエスト59:with文(コンテキストマネージャ)を使おう

スライド 1 / 6
コーデ
💻 コード例
実行結果
← クエスト一覧
🐍 Python / Quest 59 / 85

クエスト59:with文(コンテキストマネージャ)を使おう

応用 +10 XP
🏠
今回の課題
with文で使える Timer を完成させて、「開始」「処理中...」「終了」の順に表示しよう。
📖 解説を見る
🔒 with文(コンテキストマネージャ)って何?

with を使うと、処理の「前」と「後」に決まった動作を自動で行えます。__enter__ が入るときに、__exit__ が抜けるときに呼ばれます。

✏️ 書き方:
class Section:
    def __enter__(self):
        print('--- ここから ---')
        return self
    def __exit__(self, *args):
        print('--- ここまで ---')

with Section():
    print('中身')

--- ここから --- 中身 --- ここまで --- の順に出ます。with の中身を書いていないのに、前後の行が自動で足されているのがポイントです。

📋 作るもの: Timer クラスに2つのメソッドを追加します。
__enter__(引数は self だけ)… 「開始」と表示し、最後に selfreturn する
__exit__(引数は self*args)… 「終了」と表示する
with Timer():print('処理中...') は書いてあるので、開始 → 処理中... → 終了の順に出ればOK

💡 どこで使う?

「必ず後始末をしたい」処理で使います。ファイルの開閉(with open(...))、DB接続、ロックの解放、処理時間の計測など。__exit__ は途中でエラーが起きても必ず呼ばれるので、閉じ忘れ・解放し忘れを防げます。

⚠️ ポイント:
__enter__ が始め、__exit__ が終わりに呼ばれる
with ブロックを抜けると自動で __exit__ が動く
ヒントを見る
with に入るときに __enter__、抜けるときに __exit__ が自動で呼ばれるよ。__enter__ は表示のあとに self を返しておこう。__exit__ の引数を *args にしておくと、エラー情報が渡されても受け取れる。
期待する出力
開始
処理中...
終了
📄 見本
「答えを見る」を押すと、お手本のコードが出ます。クリックでコピーできます。
💻 コードエディタ
実行すると結果がここに表示されます
正解!見本と同じになりました。
次へ →
🏠 ホームへ

れんしゅうもんだい

☑ 0 / 3 正解 レッスンに戻る

全問正解でクエストクリア!

未挑戦

問題 1: contextlib.contextmanager で「→ 処理前」「→ 処理中」「→ 処理後」と表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
→ 処理前 → 処理中 → 処理後
未挑戦

問題 2: ManagedList クラスに __enter__(空リスト返す)と __exit__(長さ表示)を実装しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
長さ: 3
未挑戦

問題 3: with文 で StringIO に 'Hello' を書いて読み取って表示しよう!

実行結果
実行できたよ!
もう一度チャレンジ!
📄 見本の出力
Hello
コピーしました!