Python Academy · पाठ

__enter__ और __exit__ प्रोटोकॉल

डंडर प्रोटोकॉल का उपयोग करके कॉन्टेक्स्ट मैनेजर बनाएँ।

पाठ 2, कुल 4 में से13 चरण

__enter__ और __exit__ प्रोटोकॉल, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

कॉन्टेक्स्ट मैनेजर प्रोटोकॉल

__enter__ और __exit__ परिभाषित करने वाला कोई भी ऑब्जेक्ट कॉन्टेक्स्ट मैनेजर होता है और उसे with के साथ उपयोग किया जा सकता है।

class Managed:
    def __enter__(self):
        print("entering")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("exiting")
        return False

with Managed() as m:
    print("inside")

__enter__ का लौटाया गया मान

__enter__ को with ब्लॉक की शुरुआत में कॉल किया जाता है। इसका लौटाया गया मान as के बाद वाले चर से बाँध दिया जाता है।

class Resource:
    def __enter__(self):
        self.value = 42
        return self  # bound to 'r'

    def __exit__(self, *args):
        self.value = None
        return False

with Resource() as r:
    print(r.value)  # 42

__exit__ के आर्गुमेंट

__exit__(exc_type, exc_val, exc_tb) त्रुटि होने पर अपवाद की जानकारी प्राप्त करता है। यदि कोई अपवाद न हो, तो तीनों None होते हैं।

class Safe:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is ValueError:
            print(f"Suppressed ValueError: {exc_val}")
            return True   # suppress the exception
        return False      # re-raise anything else

with Safe():
    raise ValueError("oops")  # suppressed

अपवादों को दबाना

अपवाद को दबाने के लिए __exit__ से True लौटाएँ। उसे आगे प्रसारित करने के लिए False (या कुछ भी नहीं) लौटाएँ।

class Ignore:
    def __enter__(self): return self
    def __exit__(self, *args): return True  # swallow all exceptions

with Ignore():
    1 / 0

print("continues here")

डेटाबेस कनेक्शन का उदाहरण

एक पारंपरिक उपयोग का मामला: प्रवेश करते समय कनेक्शन प्राप्त करें, और बाहर निकलते समय commit/rollback करके उसे बंद करें।

class DBConn:
    def __enter__(self):
        self.conn = connect_db()
        return self.conn

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            self.conn.rollback()
        else:
            self.conn.commit()
        self.conn.close()
        return False

Timer कॉन्टेक्स्ट मैनेजर

__enter__ में प्रारंभिक समय दर्ज करके और __exit__ में अंतर की गणना करके बीता हुआ समय मापें।

import time

class Timer:
    def __enter__(self):
        self.start = time.perf_counter()
        return self

    def __exit__(self, *args):
        self.elapsed = time.perf_counter() - self.start
        print(f"Elapsed: {self.elapsed:.3f}s")
        return False

with Timer():
    sum(range(1_000_000))

कॉन्टेक्स्ट मैनेजर को नेस्ट करना

एक ही with पंक्ति में कई कॉन्टेक्स्ट मैनेजर जोड़े जा सकते हैं।

with open("in.txt") as src, open("out.txt", "w") as dst:
    dst.write(src.read())

पुनः उपयोग योग्य बनाम एकल-उपयोग मैनेजर

जिन कॉन्टेक्स्ट मैनेजर का __enter__ हर बार नया संसाधन आवंटित करता है, वे पुनः उपयोग योग्य होते हैं। जो आंतरिक स्थिति समाप्त कर देते हैं (जैसे केवल एक बार धारण किया गया लॉक), वे पुनः उपयोग योग्य नहीं भी हो सकते हैं।

class Reusable:
    def __enter__(self):
        return []
    def __exit__(self, *a):
        return False

for _ in range(3):
    with Reusable() as lst:
        lst.append(1)
        print(lst)  # [1] each time

__aenter__ और __aexit__ (असिंक्रोनस)

असिंक्रोनस कॉन्टेक्स्ट मैनेजर के लिए __aenter__ और __aexit__ कोरूटीन परिभाषित करें और async with का उपयोग करें।

class AsyncDB:
    async def __aenter__(self):
        self.conn = await connect()
        return self.conn

    async def __aexit__(self, *args):
        await self.conn.close()

# async with AsyncDB() as conn:
#     ...

फ़ाइल ऑब्जेक्ट को रैप करना

Python फ़ाइल ऑब्जेक्ट पहले से ही कॉन्टेक्स्ट मैनेजर प्रोटोकॉल लागू करते हैं—f.close() को मैन्युअल रूप से कभी कॉल न करें।

with open("data.txt", "r") as f:
    data = f.read()
# file is closed here automatically
print(f.closed)  # True

लॉक लागू करना

थ्रेड लॉक कॉन्टेक्स्ट मैनेजर होते हैं: __enter__ लॉक प्राप्त करता है और __exit__ उसे रिलीज़ करता है।

import threading

lock = threading.Lock()

def update_shared():
    with lock:
        # critical section
        pass

त्वरित जाँच

अपवाद को दबाने के लिए __exit__ को क्या लौटाना चाहिए?

पुनरावलोकन

कॉन्टेक्स्ट मैनेजर बनाने के लिए __enter__ और __exit__ लागू कीजिए। __enter__ से संसाधन लौटाइए और __exit__ में सफ़ाई तथा अपवाद-दमन संभालिए।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “__enter__ और __exit__ प्रोटोकॉल” पाठ निःशुल्क है?

हाँ—“__enter__ और __exit__ प्रोटोकॉल” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“__enter__ और __exit__ प्रोटोकॉल” में मैं क्या सीखूँगा?

डंडर प्रोटोकॉल का उपयोग करके कॉन्टेक्स्ट मैनेजर बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“__enter__ और __exit__ प्रोटोकॉल” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. with कथन का गहन अध्ययन
  2. __enter__ और __exit__ प्रोटोकॉल
  3. contextlib: @contextmanager
  4. व्यावहारिक कॉन्टेक्स्ट मैनेजर पैटर्न
← Python Academy पर वापस जाएँ