मैं दूसरे संदर्भ प्रबंधकों का उपयोग के सामान्य विचार और इसके बजाय (ज्यादा एक ही कारणों के लिए __del__
पर भरोसा करने की with
बयान एक जावा में finalizer तरीकों करने की कोशिश/अंत में पसंद करते हैं, के साथ साथ एक: अजगर में, __del__
तरीकों की उपस्थिति चक्रीय कचरा uncollectable कर सकते हैं)।
हालांकि, @ द्वारा दिए गए लक्ष्य "एक वस्तु है कि बाहर निकलने या एक अपवाद पर ही बाद को साफ" है कि, कार्यान्वयन ~ unutbu नहीं सही है:
@contextlib.contextmanager
def make_client():
c=Client()
yield c
c.disconnect_from_server()
with make_client() as c:
...
एक अपवाद हैं ...
भाग में उठाया गया है, disconnect_from_server_
नहीं कहा जाता है (चूंकि अपवाद make_client
के माध्यम से प्रचारित होता है, वहां बेकार नहीं होता है, और इसलिए इसे yield
पर प्रतीक्षा करते समय इसे समाप्त कर दिया जाता है)।
@contextlib.contextmanager
def make_client():
c=Client()
try: yield c
finally: c.disconnect_from_server()
अनिवार्य रूप से, with
बयान आप लगभग अच्छे पुराने ट्राई/अंत में बयान के बारे में भूल ... को छोड़कर जब आप contextlib
साथ संदर्भ प्रबंधकों लिख रहे हैं कर सकते हैं:
ठीक सरल है , और फिर यह याद रखना वाकई महत्वपूर्ण है! -)
स्रोत
2010-08-24 14:33:30
इसके अलावा, आप इसे पूरा करने के तरीकों को परिभाषित कर सकते हैं: http://docs.python.org/reference/datamodel.html#with-statement-context-managers – carl
@carl: धन्यवाद, मैं इसके बारे में भूल गया, और यह आसान होगा ... – unutbu