2011-08-22 12 views
26

मैंने हमेशा if not value की शैली में कोड किया है, हालांकि, कुछ मार्गदर्शिकाएं मेरे ध्यान में लाई हैं कि यह शैली काम करती है, ऐसा लगता है कि 2 संभावित समस्याएं हैं:पायथन: यदि वैल नहीं है, तो बनाम वैल कोई नहीं है

  1. यह पूरी तरह से पठनीय नहीं है; if value is None निश्चित रूप से अधिक समझ में आता है।
  2. इसमें बाद में प्रभाव हो सकता है (और सूक्ष्म बग का कारण बनता है), क्योंकि [] और 0 जैसी चीजें False पर भी मूल्यांकन करेंगी।

मैं भी इस तरह के रूप में अन्य की तुलना, को यह विचार लागू करने के लिए शुरू कर रहा हूँ:

  • if not value बनाम if value is False
  • if not value बनाम if value is []

और इसलिए सूची जाता है ...

सवाल यह है कि आप पी के साथ कितनी दूर जाते हैं rinciple? अपने कोड को सुरक्षित रखते हुए, रेखा को कहां खींचना है?

क्या मुझे हमेशा if value is None शैली का उपयोग करना चाहिए, इससे कोई फर्क नहीं पड़ता कि क्या?

+0

पायथन लिखने वाले विषयों में से एक ** बतख ** टाइपिंग है। 'None',' [] ',' 0' के मामले में और इसका मतलब है कि 'अगर कुछ कुछ नहीं दिखता है, तो कुछ भी नहीं होता है तो यह कुछ भी नहीं है।' यदि आपको परीक्षण किए जाने वाले मूल्य के बारे में अधिक स्पष्ट होना चाहिए, तो उपयोग करें '=='। – nagisa

उत्तर

11

यदि आप चाहते हैं तो किसी से भी तुलना करें। यदि आप केवल यह जांचना चाहते हैं कि मान को गलत माना जाता है (खाली सूची, कोई नहीं, झूठी)।

मुझे क्लीनर दिखने और पायथनिक होने के लिए "यदि मूल्य नहीं है" मिलता है।

इसके अलावा, सूचियों से सावधान रहें। रिक्त सूची की तुलना करते समय आपको इसका उपयोग नहीं करना चाहिए। यदि आपको पता है कि आपको एक सूची मिल रही है, तो "if" का उपयोग यह जांचने के लिए करें कि इसमें कोई सामग्री है (या लेन())। दुभाषिया में इस टाइप का प्रयास करें:

>>> a = [] 
>>> a is [] 
False 

इसका कारण यह है अस्थायी सूची आपके द्वारा अभी किए एक 'एक' पर संग्रहित से स्मृति में एक अलग पते है। आप इसे किसी भी, गलत या सत्य के साथ नहीं देखते हैं क्योंकि ये सभी मान हैं जो एकल हैं (वे सभी स्मृति के समान खंड को संदर्भित करते हैं) ताकि 'है' कीवर्ड कार्य का उपयोग कर रहे हों।

आपको यह भी पता चलेगा कि सीपीथॉन इंटर्न स्ट्रिंग्स निम्न कार्य करता है।

>>> 'a' is 'a' 
True 

आप इस पर भरोसा नहीं चाहिए। यह एक कार्यान्वयन विस्तार है और यह पायथन के प्रत्येक संस्करण के साथ काम करने के लिए निर्दिष्ट नहीं है।

+0

अच्छा पकड़ो। बस 'is' ऑपरेटर के बारे में कुछ नया सीखा। :) थोड़ा और शोध से मैंने पाया था कि 'यदि नहीं' '0' और' [] 'और 'गलत' जैसी चीजों के लिए उचित है, और जैसा कि कहा गया है, 'यदि मूल्य' कोई नहीं 'के लिए कोई नहीं है। समझ में आता है, क्योंकि 'अगर नहीं' हमेशा बुलियन होगा, लेकिन 'कोई नहीं' के लिए 'यदि नहीं' एक अलग कहानी है, इसलिए 'यदि मान कोई नहीं है'। :) –

16

नहीं। यदि आप मान गलत हैं तो कोड चलाने के लिए चाहते हैं लेकिन None नहीं है, यह बहुत असफल हो जाएगा।

is None का उपयोग करें यदि आप None ऑब्जेक्ट के साथ पहचान की जांच कर रहे हैं। यदि आप सिर्फ मान को गलत मानना ​​चाहते हैं तो not value का उपयोग करें।

1

मेरा उत्तर सरल है, क्योंकि यह अधिकांश कोडिंग समस्याओं पर लागू होता है: कुछ ऐसा लिखने की कोशिश न करें जो केवल काम करता है। यथासंभव स्पष्ट रूप से अपना इरादा व्यक्त करने का प्रयास करें। यदि आप यह जांचना चाहते हैं कि कोई मान गलत है, तो if not value का उपयोग करें। यदि आप None के लिए जांच करना चाहते हैं, तो इसे लिखें। यह हमेशा स्थिति और आपके फैसले पर निर्भर करता है।

आपको नियमों को खोजने की कोशिश नहीं करनी चाहिए जिन्हें बिना सोच के लागू किया जा सकता है। यदि आपको ये नियम मिलते हैं, तो यह कंप्यूटर के लिए एक नौकरी है। न ही एक इंसान के लिए! ;-)

1
if not value: 
    pass 

ठीक है और "पायथनिक" है। यह सूक्ष्म बग का कारण नहीं बनता है, नियम स्पष्ट हैं और (मुझे लगता है) easy to understand

आप झूठी और कोई नहीं के बीच अंतर करने की जरूरत है, जैसा कि आप उपयोग उल्लेख किया:

if not value is None: # or False, or == [], etc. 
    pass 

मैं ही उपरोक्त शायद ही कभी आवश्यक हैं।

सामान्य रूप से, इसे सकारात्मक स्थितियां बनाना पसंद है। उन्हें एक नज़र में समझना आसान होता है और जटिलता बढ़ जाती है (जैसा कि यह हमेशा लगता है)।

if value: 
    pass 
else: 
    pass 
+0

यही कारण है कि मैंने कहा था कि _can_ सूक्ष्म बग का कारण बनता है। मैं विवरण में नहीं जाऊंगा, लेकिन यह [पोस्ट] (http://boodebr.org/main/python/tourist/none-empty- कुछ भी नहीं) इसे समझा जाना चाहिए। :) –

+0

क्षमाप्रार्थी, लेकिन आपको सही परीक्षण निर्धारित करने और इसे लागू करने की आवश्यकता है। लिंक्ड ब्लॉग पोस्ट किसी ऐसे व्यक्ति द्वारा है जो पाइथन के सच्चे परीक्षण नियमों को समझ नहीं पाता है और इसके बजाय सी का उपयोग करना चाहता है। "सूक्ष्म" बग तब होती है जब कोई नियमों को समझ नहीं पाता है। –

4

is ऑपरेटर का आपका उपयोग थोड़ा समस्याग्रस्त है। if value is [] हमेशा झूठा होगा, उदाहरण के लिए, क्योंकि दो सक्रिय सूचियों में एक ही पहचान नहीं है।यह None के साथ बढ़िया काम करता है क्योंकि None एक सिंगलटन है (None के सभी संदर्भ एक ही वस्तु हैं) लेकिन अन्य तुलनाओं के लिए, == का उपयोग करें।

हालांकि, if value और if not value पूरी तरह से पठनीय और उपयोगी हैं। IMHO को अधिक विशिष्ट होने की आवश्यकता नहीं है, जब तक आपको विभिन्न प्रकार के सच्चाई या झूठी मानों का अलग-अलग व्यवहार करने की आवश्यकता है, उदाहरण के लिए, 0 और None के बीच अंतर करना।

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