2013-02-14 47 views
6

मैं मानक थ्रेडिंग लाइब्रेरी (पायथन 2.6) में कुछ कोड पढ़ रहा हूं और कोड का एक टुकड़ा था जिसने मुझे आश्चर्यचकित कर दिया। यह निम्न संरचना करने के लिए छोटा किया जा सकता है ( threading.py में __bootstrap_inner विधि की तुलना):पायथन मानक पुस्तकालयों में चर हटाने योग्य

def foo(): 
    exc_type, exc_value, exc_tb = sys.exc_info() 
    try: 
     # some code 
    except: 
     # some code 
    finally: 
     del exc_type, exc_value, exc_tb 

इन चरों foo दायरे के बाहर नहीं जाते। अंत में इन संदर्भों को हटाने का कोई कारण है?

उत्तर

8

हां, कम से कम exc_tb के लिए; ट्रेसबैक ऑब्जेक्ट्स वर्तमान फ्रेम का संदर्भ रखते हैं, और यह इसे एक परिपत्र संदर्भ बनाता है।

स्थानीय संदर्भ को हटाकर आप उस सर्कल को तोड़ते हैं, इसलिए आपको उम्मीद नहीं है कि कचरा कलेक्टर सक्षम होगा।

sys.exc_info() function docs से:

चेतावनी: एक समारोह है कि एक अपवाद हैंडलिंग है एक परिपत्र संदर्भ का कारण होगा में एक स्थानीय चर को ट्रैस बैक वापसी मान निर्दिष्ट करना। यह किसी भी फ़ंक्शन में स्थानीय चर द्वारा या ट्रेसबैक द्वारा संग्रहित कचरे से संदर्भित किसी भी चीज़ को रोक देगा। चूंकि अधिकांश कार्यों को ट्रेसबैक तक पहुंच की आवश्यकता नहीं होती है, इसलिए सबसे अच्छा समाधान केवल exctype, value = sys.exc_info()[:2] जैसे कुछ अपवाद प्रकार और मान निकालने के लिए उपयोग करना है। यदि आपको ट्रेसबैक की आवश्यकता है, तो इसे उपयोग के बाद इसे हटाना सुनिश्चित करें (try ... finally कथन के साथ सबसे अच्छा किया गया है) या किसी फ़ंक्शन में exc_info() पर कॉल करने के लिए जो स्वयं अपवाद को संभाल नहीं लेता है।

+0

आह, मैं देखता हूं। किसी भी तरह से मैंने इसे दस्तावेज़ों में याद किया है। धन्यवाद! – freakish