2017-01-28 4 views
7

मैं नए प्रकार को परिभाषित करने के लिए पाइथन सी एक्सटेंशन दस्तावेज़ के माध्यम से काम कर रहा हूं और बस Providing finer control over data attributes अनुभाग समाप्त कर चुका हूं।क्या Python C एक्सटेंशन के लिए Py_XDECREF के बजाय Py_DECREF का उपयोग करने का कोई लाभ है?

इस खंड में, वे यह सुनिश्चित करें कि Noddy struct के first और last विशेषताओं NULL कभी नहीं हो सकता, उदाहरण के लिए new में रिक्त स्ट्रिंग के लिए गुण आरंभ और getters और setters कि TypeError अगर बढ़ा जोड़कर उदाहरण कोड बदलने उपयोगकर्ता इन विशेषताओं को नल को हटाने या अन्यथा सेट करने का प्रयास करता है।

इसके अतिरिक्त (और मेरे सवाल का विषय), लेखक इन विशेषताओं के लिए Py_DECREF करने के लिए Py_XDECREF के सभी बदल जाता है, कि कहा:

इन परिवर्तनों के साथ

, हम आश्वस्त कर सकते हैं कि पहली और आखिरी सदस्य हैं कभी भी नहीं, इसलिए हम लगभग सभी मामलों में नल मूल्यों के लिए चेक हटा सकते हैं। इसका अर्थ यह है कि अधिकांश Py_XDECREF() कॉल को Py_DECREF() कॉल में परिवर्तित किया जा सकता है। एकमात्र जगह जिसे हम इन कॉलों को नहीं बदल सकते हैं, डीलोकेटर में है, जहां संभावना है कि इन सदस्यों की शुरुआत कन्स्ट्रक्टर में विफल रही।

मुझे ऐसा लगता है कि यह सिर्फ Py_XDECREF उपयोग करने के लिए सुरक्षित हो सकता है, यह देखते हुए कि Py_DECREF परिणाम एक segmentation fault में अगर इसकी एक NULL मूल्य पारित कर दिया।

Py_XDECREF से अधिक का उपयोग करने का क्या फायदा है?

उत्तर

5

आप जानते हैं कि वस्तु रिक्त नहीं हो सकता है, तो Py_XDECREF से अधिक Py_DECREF के लाभ कर रहे हैं:

  • यह तेजी से है, क्योंकि यह एक अनावश्यक परीक्षण और कूद से बचा जाता है;
  • इसके अतिरिक्त, यह प्रभावी रूप से एक शून्य-लागत का दावा प्रदान करता है कि सूचक नॉन-न्यूल है - यदि प्रोग्राम टूट गया है तो कार्यक्रम तुरंत क्रैश हो जाएगा।

दोनों ही बिंदु महत्वपूर्ण है जब निम्न स्तर कोड, जिसके कारण अजगर कोर और सबसे एक्सटेंशन सावधान करने के लिए केवल Py_XDECREF (या Py_CLEAR) का उपयोग करते हैं सूचक वास्तव में शून्य हो सकता है के साथ काम कर हो सकता है।

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

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