के साथ उपयोग करता है, मैं एक संदर्भ प्रबंधक लिखने की कोशिश कर रहा हूं जो अन्य संदर्भ प्रबंधकों का उपयोग करता है, इसलिए ग्राहकों को पूरे नुस्खा को जानने की आवश्यकता नहीं है, केवल इंटरफ़ेस जो मैं प्रस्तुत कर रहा हूं। मैं इसे @contextmanager
का उपयोग करके नहीं कर सकता - yield
के बाद कोड को अपवाद द्वारा बाधित होने पर निष्पादित नहीं किया जाता है, इसलिए मुझे कक्षा-आधारित प्रबंधक का उपयोग करने की आवश्यकता है।पायथन में एक संदर्भ प्रबंधक लिखना जो स्वयं ही कथन
from contextlib import contextmanager
import pprint
d = {}
@contextmanager
def simple(arg, val):
print "enter", arg
d[arg] = val
yield
print "exit", arg
del d[arg]
class compl(object):
def __init__(self, arg, val):
self.arg=arg
self.val=val
def __enter__(self):
with simple("one",1):
with simple("two",2):
print "enter complex", self.arg
d[self.arg] = self.val
def __exit__(self,*args):
print "exit complex", self.arg
del d[self.arg]
print "before"
print d
print ""
with compl("three",3):
print d
print ""
print "after"
print d
print ""
कि इस आउटपुट:
यह एक छोटा सा उदाहरण स्क्रिप्ट है
before
{}
enter one
enter two
enter complex three
exit two
exit one
{'three': 3}
exit complex three
after
{}
मैं इसे उत्पादन इस हैं:
before
{}
enter one
enter two
enter complex three
{'one': 1, 'three': 3, 'two': 2}
exit complex three
exit two
exit one
after
{}
वहाँ किसी भी तरह से एक वर्ग को बताने के लिए है अन्य संदर्भ प्रबंधकों के साथ खुद को लपेटने के लिए आधारित संदर्भ प्रबंधक?
यह अजगर संस्करण निर्दिष्ट करने के लिए उपयोगी होगा। –
सवाल क्षमा करें, लेकिन आप ऐसा क्यों करना चाहते हैं? यह मेरे लिए केवल प्राकृतिक लगता है कि कक्षा-आधारित संदर्भ प्रबंधक को अपनी निर्भरताओं को साफ करने के बाद आखिरी बार बाहर निकलना चाहिए। –
लक्ष्यीकरण पायथन 2.7, क्षमा करें –