মূল content-এ যাও

Python for AI/Errors ও Files/Lesson 32

Context Managers (with)

with statement কেন নিরাপদ — শুরু আর শেষের কাজ (খোলা/বন্ধ, চালু/বন্ধ) নিশ্চিত করা, নিজের context manager বানানো (__enter__/__exit__ আর @contextmanager), আর timing ও temporary setting-এর pattern।

সময়
22 মিনিট
Exercise
1
Challenge
1
Quiz
3 প্রশ্ন

সহজ ভাষায়

অনেক কাজের একটা শুরু আর একটা শেষ আছে, আর শেষটা অবশ্যই করতে হয়:

  • File খোলা → বন্ধ করা
  • Database connection নেওয়া → ছেড়ে দেওয়া
  • Lock নেওয়া → ছেড়ে দেওয়া
  • Timer চালু → বন্ধ

Context manager এই জুটি সামলায়, আর with statement নিশ্চিত করে শেষের কাজটা হবেই — মাঝখানে error হলেও।

main.py

কেন দরকার?

with ছাড়া একই কাজ নিরাপদভাবে করতে হলে:

main.py

চার লাইনের ঝামেলা, আর try/finally ভুলে গেলে error-এ file খোলা থেকে যায়। Server-এ হাজার request-এ হাজার খোলা file — একসময় "Too many open files" error-এ server বন্ধ।

ML-এও সবখানে context manager:

  • PyTorch-এ prediction-এর সময় with torch.no_grad(): — সাময়িকভাবে gradient হিসাব বন্ধ, memory আর সময় বাঁচে
  • with mlflow.start_run(): — experiment tracking শুরু ও শেষ
  • Mixed precision: with torch.autocast("cuda"):

এক with-এ একাধিক

main.py

নিজের context manager: __enter__ আর __exit__

যেকোনো class-এ এই দুটো dunder method থাকলে সেটা with-এ ব্যবহার করা যায়:

main.py
  • __enter__ — block শুরুর আগে চলে। যা return করে, সেটাই as-এ যায়।
  • __exit__(exc_type, exc, tb) — block শেষে সবসময় চলে। Error হলে তার তথ্য পায়, না হলে তিনটাই None।
  • __exit__ True return করলে error চাপা পড়ে — প্রায় কখনোই এটা চাও না।

সহজ উপায়: @contextmanager

Class না লিখে, একটা function আর yield দিয়ে:

main.py

yield-এর আগের অংশ শুরুতে, পরের অংশ শেষে। try/finally দিয়ে ঘিরলে error-এও শেষের অংশ চলে।

Exercise

Exercise

Timer context manager

+20 XP

Timer class বানাও যেটা with block-এর ভেতরের code কতক্ষণ চলল মাপে:

  • __enter__ — শুরুর সময় রাখবে আর self return করবে
  • __exit__ — শেষ হলে মোট সময় (সেকেন্ডে) self.elapsed-এ রাখবে

সময় মাপতে time.perf_counter() ব্যবহার করো।

solution.py

Quiz

  1. Q1with open("f.txt") as f: block-এর ভেতরে error হলে file-এর কী হয়?
  2. Q2with X() as v: — v-এর মান কোথা থেকে আসে?
  3. Q3@contextmanager function-এ yield-এর আগের আর পরের code কখন চলে?
0/3 answered

Challenge

Challenge

সাময়িক setting

+50 XP

@contextmanager দিয়ে override(config, **changes) বানাও। with block-এর ভেতরে config dictionary-তে changes-এর মানগুলো বসবে; block শেষে আগের অবস্থা হুবহু ফিরে আসবে:

  • আগে থেকে থাকা key → আগের মান ফিরবে
  • আগে ছিল না এমন key → মুছে যাবে
  • block-এর ভেতরে error হলেও ফিরবে (আর error চাপা পড়বে না)
solution.py

বাস্তবে কোথায় ব্যবহার হয়?

একটা training pipeline-এর প্রতিটা ধাপের সময় মাপা — কোন ধাপ সবচেয়ে ধীর সেটা খুঁজতে (profiling):

main.py

Optimize করার আগে মাপো — অনুমানে ভুল জায়গায় সময় নষ্ট হয়। এই project-এর মূলনীতিতেও লেখা আছে: "Measure first."

Interview প্রশ্ন

  • Beginner: with statement কী করে? File-এর ক্ষেত্রে কেন ব্যবহার করবে?
  • Intermediate: __enter__ আর __exit__ কী? __exit__ True return করলে কী হয়?
  • Advanced: PyTorch-এর torch.no_grad() context manager হিসেবে কী করে, আর inference-এর সময় কেন দরকার?

এরপর কী?

অভিনন্দন! 🎉 Errors ও Files module শেষ — আর সেই সাথে Python-এর মূল অংশ। তুমি এখন robust code লিখতে পারো, real file থেকে data পড়তে আর লিখতে পারো।

এবার শুরু আসল data science যাত্রা। পরের module: NumPy — সব ML library-র নিচে থাকা numerical computing-এর ভিত্তি। এখন পর্যন্ত লেখা loop-গুলো ১০০ গুণ দ্রুত চালানো শিখবে।