2015-10-14 4 views
5

का मान मुझे यह स्पष्ट है कि None का उपयोग मूल्य की कमी को इंगित करने के लिए किया जाता है। लेकिन चूंकि सब कुछ कार्यान्वयन के दौरान अंतर्निहित मूल्य होना चाहिए, इसलिए मैं देख रहा हूं कि CPython के संबंध में मूल्य की अनुपस्थिति को इंगित करने के लिए किस मूल्य का उपयोग किया गया है।Py_None

मैं documentation के आधार पर समझता हूं, NoneObject एक सिंगलटन है। चूंकि मेरे c कौशल जंगली हैं, मेरा सबसे अच्छा, शौकिया अनुमान, यह होगा कि None का मान Py_None ऑब्जेक्ट के लिए आवंटित स्मृति के सूचक होगा; चूंकि यह एक सिंगलटन है, यह विशिष्टता की गारंटी देगा। या इसे c के NULL पर सौंपा गया है, जिसमें this question में दूसरे उत्तर के आधार पर 0x0000 का मूल्य है?

साथ ही, प्रलेखन यह भी बताता है:

ध्यान दें कि कोई भी के लिए PyTypeObject सीधे अजगर/सी एपीआई में उजागर नहीं किया गया है।

जो मैं अनुमान लगा रहा हूं इसका मतलब है कि आप इसे स्रोत के माध्यम से खोज नहीं सकते हैं। (मैंने जो किया, उसे नहीं पता कि object.c के लिए कहां देखना है, मैं कुछ भी समझ सकता हूं)

लेकिन मैं इस पर मेरी राय के बारे में निश्चित नहीं हूं इसलिए मैंने पूछा।

ऑब्जेक्ट CPython में ऑब्जेक्ट के लिएस्तर मान क्या है?

+1

'Py_None' * * है मूल्य। –

+0

'Py_None' एक सूचक है। आप 'आईडी (कोई नहीं) ' –

+0

का उपयोग करने के लिए मेमोरी पता प्राप्त कर सकते हैं तो' Py_None' के लिए यह' value == पहचान' है? –

उत्तर

5

Py_NoneInclude/object.h में एक मैक्रो परिभाषा है। यह _Py_NoneStructobject.c में एक उपनाम है जो PyObject प्रकार (जो एक संरचना है) के वैश्विक चर (स्थिरता के रूप में) वैश्विक स्थिर है। इसे पायथन शब्द NoneType (object.c में इसके ऊपर परिभाषित किया गया है और केवल _Py_NoneStruct के लिए उपयोग किया जाता है) में निर्दिष्ट किया गया है।

तो यह सी में नल या कोई अन्य विशेष मूल्य नहीं है, यह _PyNone_Type का एक सिंगलटन PyObject उदाहरण है। _PyNone_TypePyTypeObject के लिए खुलासा नहीं किया जा रहा है, मुझे लगता है कि वे static कीवर्ड (यानी आंतरिक लिंकेज) का संदर्भ लेते हैं जिसका अर्थ है कि PyTypeObject केवल object.c के भीतर पहुंच योग्य है और केवल PyNone की परिभाषा के लिए उपयोग किया जाता है।

बस थोड़ा सा जोड़ने के लिए, जब भी दस्तावेज़ कहता है कि PyNone में कोई प्रकार नहीं है, तो इसे सचमुच नहीं लिया जाना चाहिए। इसमें एक विशेष प्रकार का प्रकार है, NoneType, जिसे आप अभी भी None सिंगलटन के माध्यम से एक्सेस कर सकते हैं लेकिन आप नए उदाहरण नहीं बना सकते हैं या सामान्य प्रकार के साथ कोई अन्य चीज नहीं कर सकते हैं। वहाँ नए उदाहरणों बनाने नहीं के लिए एक हार्ड-कोडेड सीमा प्रतीत हो रहा है, और यद्यपि मैं वास्तव में नहीं मिल सकता है, जहां यह CPython स्रोत आप उसके प्रभाव देख सकते हैं जब एक नया उदाहरण बनाने का प्रयास कर में परिभाषित किया गया है:

>>> type(None) 
<type 'NoneType'> 
>>> type(None)() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: cannot create 'NoneType' instances 

संपादित करें: ऐसा लगता है कि त्रुटि typeobject.c से फेंक दी गई है जब tp_new फ़ील्ड शून्य है।आश्चर्यजनक रूप से _PyNone_Type को गैर-न्यूल tp_new (पर object.c में) के साथ परिभाषित किया गया है। इसे किसी बिंदु पर बाद में न्यूल पर सेट किया जा सकता है, लेकिन यह केवल एक कार्यान्वयन विवरण है और वास्तव में आपके प्रश्न के दायरे में कोई फर्क नहीं पड़ता है।

+1

आपकी अंतिम वाक्य के संबंध में, मुझे लगता है कि 'noneType' प्रकार' का कोई नया उदाहरण नहीं है बनाया जा सकता है (और इसके बजाय त्रुटि उठाई जाती है) क्योंकि टाइप स्ट्रक्चर में 'tp_new' जगह जानबूझकर छोड़ी गई है। त्रुटि [इस फ़ंक्शन] में उठाई गई है (https://github.com/python/cpython/blob/0d2e50ea6ac5fa6e7df32dbd4bbbf6da5bcdfdc4/Objects/typeobject.c#l890) –

+0

यही मुझे लगा, @ajcr हालांकि यह वास्तव में गैर- नल ([यहां] (https://github.com/python/cpython/blob/HEAD/Objects/object.c#L1466))। इसे किसी बिंदु पर न्यूल पर सेट किया जाना चाहिए क्योंकि इस त्रुटि को उठाने का एक और तरीका प्रतीत नहीं होता है। – gbs

1

Py_NonePy_None है, और सामान्य ऑपरेशन के दौरान किसी फ़ंक्शन से वापस लौटाया जाना चाहिए और यदि कोई अन्य मूल्य वापस नहीं किया जाना चाहिए। NULL केवल तभी लौटाया जाता है जब वास्तविक अपवाद ऑब्जेक्ट created/assigned separately के साथ VM को अपवाद सिग्नल किया जाए।

+0

मुझे अभी भी यह नहीं मिल रहा है। 'Py_None'' Py_None' उतना ही भ्रमित है जितना मैं पूछने की कोशिश कर रहा हूं। जो मैं समझता हूं, 'Py_None' एक' सी' स्तर संरचना, या एक समान 'सी' मान होना चाहिए। 'Py_None' का' c' मान क्या होगा, शायद एक बेहतर प्रश्न होगा। –

+0

https://hg.python.org/releasing/2.7.9/file/753a8f457ddc/Include/object.h#l841 –

1

Py_None_Py_NoneStruct संरचना परिभाषा के पते का मूल्य है।

the code देखें:

/* 
_Py_NoneStruct is an object of undefined type which can be used in contexts 
where NULL (nil) is not suitable (since NULL often means 'error'). 

Don't forget to apply Py_INCREF() when returning this value!!! 
*/ 
PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ 
#define Py_None (&_Py_NoneStruct)