Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Python

कथन के संदर्भों के लिए पायथन उपयोगिताएँ (contextlib)

पायथन के मानक पुस्तकालय का संदर्भलिब मॉड्यूल 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 एक प्रोग्राम में संसाधनों के प्रभावी प्रबंधन के लिए पायथन की एक बहुत ही उपयोगी विशेषता है।


  1. QuickSort के लिए पायथन प्रोग्राम

    इस लेख में, हम नीचे दिए गए समस्या कथन के समाधान के बारे में जानेंगे। समस्या कथन - हमें एक सरणी दी गई है, हमें इसे क्विकॉर्ट की अवधारणा का उपयोग करके क्रमबद्ध करने की आवश्यकता है यहां हम पहले सरणी को विभाजित करते हैं और क्रमबद्ध सरणी प्राप्त करने के लिए अलग विभाजन को सॉर्ट करते हैं। आइए अब नीचे दि

  1. पायथन में फाइल ऑब्जेक्ट्स?

    पायथन में, जब भी हम फ़ाइलों को पढ़ने या लिखने की कोशिश करते हैं, तो हमें किसी पुस्तकालय को आयात करने की आवश्यकता नहीं होती है क्योंकि इसे मूल रूप से संभाला जाता है। फ़ाइल ऑब्जेक्ट प्राप्त करने के लिए सबसे पहले हम बिल्ट-इन ओपन फ़ंक्शन का उपयोग करेंगे। खुला फ़ंक्शन एक फ़ाइल खोलता है और एक फ़ाइल ऑब्ज

  1. पायथन में जंक फाइल ऑर्गनाइज़र?

    यह एक आलसी अजगर प्रोग्रामर के लिए बहुत उपयोगी लग सकता है जो अधिकांश फाइलों और फ़ोल्डरों को एक स्थान पर रखता है और कभी-कभी भ्रमित होता है कि सभी फाइलें क्या हैं और निश्चित रूप से वह इसे मैन्युअल रूप से करने के लिए बहुत आलसी है। तो नीचे एक पायथन प्रोग्राम है जो एक ही बार में उपयुक्त फ़ोल्डर में सब कुछ