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 হলেও।
কেন দরকার?
with ছাড়া একই কাজ নিরাপদভাবে করতে হলে:
চার লাইনের ঝামেলা, আর 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-এ একাধিক
নিজের context manager: __enter__ আর __exit__
যেকোনো class-এ এই দুটো dunder method থাকলে সেটা with-এ ব্যবহার করা যায়:
__enter__— block শুরুর আগে চলে। যা return করে, সেটাইas-এ যায়।__exit__(exc_type, exc, tb)— block শেষে সবসময় চলে। Error হলে তার তথ্য পায়, না হলে তিনটাইNone।__exit__Truereturn করলে error চাপা পড়ে — প্রায় কখনোই এটা চাও না।
সহজ উপায়: @contextmanager
Class না লিখে, একটা function আর yield দিয়ে:
yield-এর আগের অংশ শুরুতে, পরের অংশ শেষে। try/finally দিয়ে ঘিরলে error-এও শেষের অংশ চলে।
Exercise
Exercise
Timer context manager
Timer class বানাও যেটা with block-এর ভেতরের code কতক্ষণ চলল মাপে:
__enter__— শুরুর সময় রাখবে আরselfreturn করবে__exit__— শেষ হলে মোট সময় (সেকেন্ডে)self.elapsed-এ রাখবে
সময় মাপতে time.perf_counter() ব্যবহার করো।
Quiz
Challenge
Challenge
সাময়িক setting
@contextmanager দিয়ে override(config, **changes) বানাও। with block-এর ভেতরে config dictionary-তে changes-এর মানগুলো বসবে; block শেষে আগের অবস্থা হুবহু ফিরে আসবে:
- আগে থেকে থাকা key → আগের মান ফিরবে
- আগে ছিল না এমন key → মুছে যাবে
- block-এর ভেতরে error হলেও ফিরবে (আর error চাপা পড়বে না)
বাস্তবে কোথায় ব্যবহার হয়?
একটা training pipeline-এর প্রতিটা ধাপের সময় মাপা — কোন ধাপ সবচেয়ে ধীর সেটা খুঁজতে (profiling):
Optimize করার আগে মাপো — অনুমানে ভুল জায়গায় সময় নষ্ট হয়। এই project-এর মূলনীতিতেও লেখা আছে: "Measure first."
Interview প্রশ্ন
- Beginner:
withstatement কী করে? File-এর ক্ষেত্রে কেন ব্যবহার করবে? - Intermediate:
__enter__আর__exit__কী?__exit__Truereturn করলে কী হয়? - 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-গুলো ১০০ গুণ দ্রুত চালানো শিখবে।