পাইথনের স্ট্যান্ডার্ড লাইব্রেরির contextlib মডিউল কনটেক্সট ম্যানেজার ক্লাসকে সংজ্ঞায়িত করে যার অবজেক্ট একটি প্রোগ্রামের মধ্যে সংস্থানগুলি সঠিকভাবে পরিচালনা করে। পাইথনের কীওয়ার্ড রয়েছে যা প্রসঙ্গ পরিচালকদের সাথে কাজ করে। ফাইল অবজেক্ট (যা বিল্ট-ইন open() ফাংশন দ্বারা ফেরত দেওয়া হয়) ContextManager API সমর্থন করে। তাই আমরা প্রায়ই ফাইলের সাথে কাজ করার সময় ব্যবহৃত কীওয়ার্ড খুঁজে পাই।
নিম্নলিখিত কোড ব্লক একটি ফাইল খোলে এবং এতে কিছু ডেটা লেখে। অপারেশন শেষ হওয়ার পরে, ফাইলটি বন্ধ হয়ে যায়, ব্যর্থ হলে কোন ফাইল বর্ণনাকারীটি ফাঁস হওয়ার সম্ভাবনা থাকে যার ফলে ফাইল দুর্নীতি হয়৷
f = open("file.txt","w") f.write("hello world") f.close()
যাইহোক একই ফাইল অপারেশন ফাইলের কনটেক্সট ম্যানেজার ক্ষমতা ব্যবহার করে নিম্নলিখিত সিনট্যাক্স ব্যবহার করে করা হয়।
with open("file.txt","w") as f: f.write("hello world") print ("file is closed")
উপরে উল্লিখিত হিসাবে, ফাইল অবজেক্ট ContextManager প্রয়োগ করে। এটি কীওয়ার্ড দিয়ে সক্রিয় করা হয়েছে। সঙ্গে ব্লকে ফাইল অবজেক্টের জন্য প্রক্রিয়াকরণের জন্য বিবৃতি রয়েছে। ব্লকের সাথে সাথেই, ফাইল অবজেক্টটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় (ক্লোজ() পদ্ধতিটি স্পষ্টভাবে বলা উচিত নয়)। ব্লকের সাপেক্ষে যেকোন বস্তু শুধুমাত্র ব্লকের ভিতরেই সক্রিয় থাকবে এবং অবিলম্বে এর শেষে নিষ্পত্তি করা হবে।
কনটেক্সট ম্যানেজার ক্লাসে দুটি প্রয়োজনীয় পদ্ধতি রয়েছে __এন্টার__() এবং __এক্সিট__()
__এন্টার__() - ব্লক দিয়ে শুরু হলে কল করা হবে। এটি নির্দেশ করে যে প্রোগ্রামটি এই বস্তুর সাথে সম্পর্কিত রানটাইম প্রসঙ্গে প্রবেশ করেছে।
__প্রস্থান__() − যখন ব্লক দিয়ে শেষ হয়ে যায় তখন বলা হয়। এটি নির্দেশ করে যে প্রোগ্রামটি এই বস্তুর সাথে সম্পর্কিত রানটাইম প্রসঙ্গ থেকে প্রস্থান করে।
ফাইল অবজেক্টেরও এই দুটি পদ্ধতি রয়েছে যা দোভাষী সেশন অনুসরণ করে নিশ্চিত করা যেতে পারে।
>>> f = open("file.txt","w") >>> f.__enter__() <_io.TextIOWrapper name = 'file.txt' mode = 'w' encoding = 'cp1252'> >>> f.write("hello world") 11 >>> f.__exit__() >>> f.write("hello world") Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> f.write("hello world") ValueError: I/O operation on closed file.
যখন __exit__() পদ্ধতি কল করা হয়, ফাইলটি বন্ধ হয়ে যায়। এই কারণেই ফাইলটি বন্ধ হওয়ার পরে আমরা কিছু ডেটা লেখার চেষ্টা করার সময় ValueError দেখা যায়৷
নিচে প্রদত্ত হল contextManager-এর আরও সাধারণ ব্যবহার। প্রথমে আমরা একটি ক্লাসকে __enter__() এবং __exit__() পদ্ধতি দিয়ে সংজ্ঞায়িত করি এবং স্টেটমেন্ট সহ ব্যবহার করে এর অবজেক্টের জন্য contextManager সক্ষম করি।
উদাহরণ সহimport contextlib class WithExample: def __init__(self): print ("object initialized") def __enter__(self): print ("entered context") def __exit__(self, *args): print ("exited context") with WithExample() as w: print ('this is a contextlib example') print ('used by with statement') print ('end of with block')
আউটপুট দেখায় যে সঙ্গে ব্লক শুরু হওয়ার সাথে সাথে __এন্টার__() পদ্ধতিটি কার্যকর করা হয়। ব্লকের মধ্যে বিবৃতি প্রক্রিয়া করা হয়. ব্লক শেষ হয়ে গেলে, __exit__() পদ্ধতিটি স্বয়ংক্রিয়ভাবে কল করা হয়।
object initialized entered context this is a contextlib example used by with statement exited context end of with block
contextlib মডিউলটিতে @contextmanager ডেকোরেটর রয়েছে যার সাহায্যে আমরা স্বয়ংক্রিয়ভাবে বিবৃতি সহ সমর্থন করার জন্য একটি জেনারেটর ভিত্তিক কারখানা ফাংশন লিখতে পারি। ডেকোরেটরের সাথে ফাইল অবজেক্টের প্রসঙ্গ ব্যবস্থাপনা নিম্নরূপ -
from contextlib import contextmanager @contextmanager def openfile(name): try: f = open(name, 'w') yield f finally: f.close() with openfile(file.txt') as f: f.write('hello world') print ('file is closed')
কনটেক্সট ম্যানেজার এইভাবে একটি প্রোগ্রামে সম্পদের কার্যকর ব্যবস্থাপনার জন্য পাইথনের একটি খুব দরকারী বৈশিষ্ট্য৷