__enter__ और __exit__ प्रोटोकॉल
डंडर प्रोटोकॉल का उपयोग करके कॉन्टेक्स्ट मैनेजर बनाएँ।
__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 FalseTimer कॉन्टेक्स्ट मैनेजर
__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 पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- with कथन का गहन अध्ययन
- __enter__ और __exit__ प्रोटोकॉल
- contextlib: @contextmanager
- व्यावहारिक कॉन्टेक्स्ट मैनेजर पैटर्न