पायथन के मानक पुस्तकालय का संदर्भलिब मॉड्यूल ContextManager वर्ग को परिभाषित करता है जिसका ऑब्जेक्ट किसी प्रोग्राम के भीतर संसाधनों का ठीक से प्रबंधन करता है। पायथन में कीवर्ड है जो संदर्भ प्रबंधकों के साथ काम करता है। फ़ाइल ऑब्जेक्ट (जो बिल्ट-इन ओपन () फ़ंक्शन द्वारा लौटाया जाता है) 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 को लागू करता है। यह कीवर्ड के साथ सक्षम है। with ब्लॉक में फाइल ऑब्जेक्ट के लिए प्रोसेस किए जाने वाले स्टेटमेंट होते हैं। जैसे ही ब्लॉक समाप्त होता है, फ़ाइल ऑब्जेक्ट स्वचालित रूप से बंद हो जाता है (क्लोज़ () विधि को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है)। कोई भी वस्तु जो ब्लॉक के अधीन है, केवल ब्लॉक के अंदर ही सक्रिय होगी और उसके अंत में तुरंत निपटा दी जाएगी।
ContextManager वर्ग में दो आवश्यक विधियाँ हैं __enter__() और __exit__()
__enter__() - ब्लॉक शुरू होने पर कॉल किया जाएगा। यह इंगित करता है कि प्रोग्राम ने इस ऑब्जेक्ट से संबंधित रनटाइम संदर्भ में प्रवेश किया है।
__निकास__() - ब्लॉक खत्म होने पर कॉल किया जाता है। यह इंगित करता है कि प्रोग्राम इस ऑब्जेक्ट से संबंधित रनटाइम संदर्भ से बाहर निकलता है।
फ़ाइल ऑब्जेक्ट में भी ये दो विधियां हैं, जैसा कि निम्नलिखित दुभाषिया सत्र द्वारा पुष्टि की जा सकती है।
>>> 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 प्रकट होता है जब हम फ़ाइल को बंद करने के बाद उसमें कुछ डेटा लिखने का प्रयास करते हैं।
नीचे दिए गए संदर्भ प्रबंधक का अधिक सामान्यीकृत उपयोग है। सबसे पहले हम __enter__() और __exit__() विधियों के साथ एक वर्ग को परिभाषित करते हैं और कथन के साथ प्रयोग करके इसके ऑब्जेक्ट के लिए संदर्भ प्रबंधक को सक्षम करते हैं।
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')
आउटपुट से पता चलता है कि जैसे ही with ब्लॉक शुरू होता है, __enter__() विधि निष्पादित हो जाती है। ब्लॉक के भीतर बयान संसाधित हो जाते हैं। जब ब्लॉक खत्म हो जाता है, तो __exit__() को स्वचालित रूप से कॉल किया जाता है।
object initialized entered context this is a contextlib example used by with statement exited context end of with block
कॉन्टेक्स्टलिब मॉड्यूल में @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')
इस प्रकार ContextManager एक प्रोग्राम में संसाधनों के प्रभावी प्रबंधन के लिए पायथन की एक बहुत ही उपयोगी विशेषता है।