2009-10-05 17 views

उत्तर

94

close विधि परिणाम urllib.urlopen की, नहीं urllib मॉड्यूल में ही आप के बारे में सोच रहे हैं के रूप में पर पर बुलाया जाना चाहिए (जैसा कि आप urllib.close उल्लेख - जो मौजूद नहीं है)।

सबसे अच्छा तरीका

: x = urllib.urlopen(u) आदि, उपयोग के बजाय:

import contextlib 

with contextlib.closing(urllib.urlopen(u)) as x: 
    ...use x at will here... 

with बयान है, और closing संदर्भ प्रबंधक, यहां तक ​​कि अपवाद की उपस्थिति में उचित बंद सुनिश्चित करेगा।

+8

'data = urllib2.urlopen ('url') जैसे कुछ करने के बारे में क्या है। पढ़ें()' –

+13

पायथन 3 में, कथन के लिए प्रत्यक्ष समर्थन जोड़ा गया था। urllib.urlopen (u) के साथ x: ... –

3

कड़ाई से बोलते हुए, यह सच है। लेकिन व्यावहारिक रूप से, एक बार (अगर) urllib गुंजाइश से बाहर हो जाता है, कनेक्शन स्वचालित कचरा कलेक्टर द्वारा बंद कर दिया जाएगा।

+10

यह पायथन के कुछ कार्यान्वयन के लिए सच है, लेकिन पाइथन भाषा इस बात की गारंटी नहीं देती है कि जैसे ही ऑब्जेक्ट गुंजाइश हो जाता है, बंद हो जाएगा। सीएफ jython –

+1

@gnibbler इस उत्तर के लेखक यह नहीं बताते हैं कि यह होगा * जैसे ही * यह होगा कि यह होगा। –

+2

@ पियोटर, लेकिन शायद प्रोग्राम क्रैश हो जाए यदि मेरे पास लूप खोलने वाले यूआरएल हैं और जीसी पर्याप्त तेज़ नहीं कर रहा है। यह चीजों को करने के लिए एक बहुत ही बेवकूफ तरीका है और उत्पादन कोड में नहीं है। –

11

@ पीटर कहते हैं, आउट-ऑफ-स्कोप खोले गए यूआरएल कचरे के संग्रह के लिए पात्र बन जाएंगे।

हालांकि, यह भी ध्यान रखें कि urllib.py परिभाषित करता है:

def __del__(self): 
     self.close() 

इसका मतलब है कि जब कि उदाहरण के लिए संदर्भ गिनती शून्य, अपने __del__ विधि बुलाया जाएगा, और इस तरह अपनी close पद्धति के रूप में बुलाया जाएगा तक पहुँच जाता है कुंआ। संदर्भ संख्या के लिए शून्य तक पहुंचने के लिए सबसे सामान्य "तरीका" उदाहरण को केवल दायरे से बाहर जाने देना है, लेकिन कुछ स्पष्ट रूप से आपको स्पष्ट del x से कुछ भी नहीं रोक रहा है (हालांकि यह सीधे __del__ पर कॉल नहीं करता है बल्कि संदर्भ गणना को कम करता है एक - एक करके)।

यह निश्चित रूप से अच्छा शैली है स्पष्ट रूप से अपने संसाधनों को बंद करने के - लेकिन अजगर स्वचालित रूप से आप कुछ भी तरह हास्यास्पद नहीं करते है, तो आप के लिए साफ होगा - विशेष रूप से जब आपके आवेदन कहा संसाधनों का अत्यधिक उपयोग करने का खतरा बना ऐसे मामलों के संदर्भ (परिपत्र?) संदर्भ जिन्हें आपको अब और आवश्यकता नहीं है।

+2

कचरा कलेक्टर को ओवरराउन करने के लिए यह संभव है - मेरे पास ऐसे मामले हैं जहां मैं फ़ाइल को हैंडल को तेज़ी से बंद कर रहा हूं [लेकिन जहां एक स्पष्ट 'जीसी।इकट्ठा करें() 'कॉल, या' क्लोज़() ', साफ चीजें ऊपर]। –

संबंधित मुद्दे