2015-05-15 13 views
7

None एक वस्तु है।क्यों नहीं (कोई नहीं) वापसी 0? पाइथन में

>>> isinstance(None, object) 
True 

और इस तरह यह __str __()

>>> str(None) 
'None' 

जैसे कार्यों को रोजगार के रूप में लेकिन क्यों यह __len __ के लिए भी ऐसा ही नहीं है()?

>>> len(None) 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    len(None) 
TypeError: object of type 'NoneType' has no len() 

ऐसा लगता है जैसे कि यह pythonic एक ही तरीका है कि if list स्वीकार्य है, भले ही चर None है और न सिर्फ एक खाली सूची होगी।

क्या ऐसे मामले हैं जो len(None) अधिक समस्या का उपयोग करेंगे?

+11

क्योंकि 'none' में' __len__' नहीं है; यह ['आकार '] नहीं है (https://docs.python.org/2/library/collections.html#collections.Sized)। – jonrsharpe

+0

@ जोंरशर्प लेकिन इसमें केवल एक जोड़ा गया फ़ंक्शन हो सकता है जो 0 को कोई फर्क नहीं पड़ता। – SuperBiasedMan

+0

यह हो सकता है लेकिन यह ज्यादा समझ में नहीं आता है। किसी ऑब्जेक्ट की लंबाई क्यों न हो जब तक कि यह ऑब्जेक्ट्स का संग्रह न हो? –

उत्तर

8

आप इस चाहते हैं कि उल्लेख:

: एक फ़ंक्शन जब None बजाय एक सूची

मुमकिन है की

क्योंकि यह एक त्रुटि के रूप में अक्सर आता है, तो आप कोड की तरह है

list_probably = some_function() 
for index in range(len(list_probably)): 
    ... 

और प्राप्त हो रहे हैं:

TypeError: object of type 'NoneType' has no len() 

नोट निम्नलिखित:

  • lenसंग्रह की लंबाई निर्धारित करने के लिए है (उदाहरण के लिए list, dict या str - ये Sized ऑब्जेक्ट्स हैं)। यह मनमानी वस्तुओं को पूर्णांक में परिवर्तित करने के लिए नहीं है - उदाहरण के लिए int या bool के लिए भी लागू नहीं किया गया है;
  • यदि None एक संभावना है, तो आपको स्पष्ट रूप से if list_probably is not None का परीक्षण करना चाहिए। उदाहरण का प्रयोग करना if list_probablyNone और खाली सूची [] का इलाज करेगा, जो शायद सही व्यवहार नहीं है; और
  • आमतौर पर सूचियों से निपटने का एक बेहतर तरीका है range(len(...)) - उदा। for item in list_probably, zip का उपयोग कर, आदि

को लागू करने के लिए Nonelen होगा सिर्फ त्रुटियों जहां None व्यवहार किया जाता है जा रहा है, गलत तरीके से, किसी अन्य वस्तु की तरह छिपाने - प्रति the Zen of Python (import this):

त्रुटियाँ चाहिए चुपचाप कभी पास नहीं।

इसी for item in None विफल हो जाएगा, लेकिन इसका मतलब यह नहीं है कि लागू करने None.__iter__ एक अच्छा विचार है!त्रुटियां एक अच्छी बात है - वे आपको अपने कार्यक्रमों में समस्याओं को जल्दी से ढूंढने में मदद करते हैं।

14

len केवल वस्तुओं के संग्रह के लिए समझ में आता है - कोई भी संग्रह नहीं है।

+0

क्या यह कहने के लिए स्वाभाविक रूप से कम समझ में आता है कि यह हमेशा 'कोई नहीं' की सत्यता (या, झूठीपन) से 0 लौटा सकता है? – SuperBiasedMan

+0

@SuperBiasedMan हां, यह कम समझ में आता है। खुद से पूछें, लाल रंग की लंबाई 0 है? – orlp

+1

@SuperBiasedMan हाँ! एक पूर्णांक की लंबाई भी नहीं होती है, लेकिन सत्यता है - https://docs.python.org/2/library/stdtypes.html#truth-value-testing देखें। यह भी ध्यान रखें कि आपको आम तौर पर * सत्य * के बजाय * पहचान * द्वारा 'कोई नहीं' का परीक्षण करना चाहिए। – jonrsharpe

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