PEP-343 के अनुसार
, एक with
बयान से अनुवाद:
with EXPR as VAR:
BLOCK
रहे हैं:
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
जैसा कि आप देख सकते हैं, वहाँ स्पष्ट कुछ भी नहीं की __enter__()
विधि के लिए आप कॉल से क्या कर सकते हैं संदर्भ प्रबंधक जो बयान के साथ शरीर को छोड़ सकता है ("BLOCK
")।
लोगों ने withhacks जैसी परियोजनाओं में __enter__()
के अंदर कॉल स्टैक में हेरफेर करने जैसे पायथन-कार्यान्वयन-विशिष्ट चीजें की हैं। मुझे एलेक्स मार्टेलि को एक साल या दो बार स्टैक ओवरफ्लो पर एक बहुत ही रोचक-हैक पोस्ट करना याद है (खोजने के लिए पोस्ट ऑफ-हाथ को पर्याप्त याद नहीं है)।
लेकिन आपके प्रश्न/समस्या का सरल जवाब यह है कि आप जो भी पूछ रहे हैं वह नहीं कर सकते हैं, तथाकथित "गहरे जादू" का उपयोग किए बिना, कथन के शरीर को छोड़कर, जो कि पाइथन के बीच जरूरी नहीं है कार्यान्वयन)। गहरे जादू के साथ, आप इसे करने में सक्षम हो सकते हैं, लेकिन मैं यह देखने में एक अभ्यास के रूप में ऐसी चीजों को करने की सलाह देता हूं कि यह कैसे किया जा सकता है, कभी भी "उत्पादन कोड" में नहीं।
स्रोत
2012-09-26 03:54:27
मुझे यह मिला, लेकिन मुझे नहीं पता कि इसका अर्थ कैसे बनाया जाए, न ही इसे कैसे कार्यान्वित किया जाए। http://www.python.org/dev/peps/pep-0377/ क्या अन्य और सुरुचिपूर्ण तरीके हैं? –
तथ्य यह है कि यह एक पीईपी है (और अर्थपूर्ण परिवर्तनों की चर्चा) से पता चलता है कि इसे दुभाषिया के व्यवहार को बदलने के बिना लागू नहीं किया जा सकता है। – nneonneo
स्वच्छता के साथ जुनूनी? :) ए(), बी(): जहां बी का __enter__ कुछ बढ़ा सकता है मुझे ठीक लगता है। – swang