2012-08-07 12 views
12

के साथ मतभेद मेरी साइटों में से एक के लिए, मुझे यह जांचना होगा कि क्या कई वर्ग विशेषताओं को परिभाषित किया गया है और खाली नहीं है। अब तक, मैंने खुशी से if self.attr: का उपयोग किया है, जो मेरे दिमाग में if self.attr is not None and self.attr is not '': के लिए शॉर्टेंड है, या जो भी विशेषता का अपरिभाषित मान है।स्ट्रिंग्स और ऑपरेटर: सर्वोत्तम अभ्यास, +

यह ठीक काम करता है, लेकिन कई स्ट्रिंग विशेषताओं की जांच करते समय आश्चर्यजनक व्यवहार को उत्पन्न करता है। '' and ''False नहीं है (जैसा कि मैंने अपेक्षित था), लेकिन ''

यह सवाल पूछता है: क्या अन्य प्रकार हैं जिनके लिए and ऑपरेटर bool पर टाइपकास्ट को मजबूर नहीं करता है? मैं एक उदाहरण के साथ नहीं आ सकता हूं जहां व्यवहार में यह अंतर if -clause (सभी के बाद, '' अभी भी False का मूल्यांकन करता है) के लिए वास्तविक भिन्न परिणाम का कारण बनता है, लेकिन मुझे लगता है कि किनारे के मामले हैं जो किनारे के मामलों में हो सकते हैं एक जाल बनो

आखिरकार, मैं जानना चाहूंगा कि क्या कोई जानता है कि इसे इस तरह क्यों लागू किया गया था? मैंने सोचा था कि पायथन के जेन केवल एक तरफ और एक तरफ प्रोत्साहित करते हैं, और + ऑपरेटर स्ट्रिंग कॉन्सटेनेशन के लिए सहज ज्ञान युक्त तरीके से पहले से ही प्रतीत होता है।

+1

क्या आप यहां कोड डाल सकते हैं? –

+1

उत्तर इस सवाल को कवर करने के लिए प्रतीत नहीं होते हैं, प्रश्न के बूलियन भाग पर ध्यान केंद्रित करते हैं, लेकिन 'और' स्ट्रिंग concatenation कभी नहीं करता है; यह बिल्कुल '+' की तरह नहीं है। – geoffspear

+1

[स्ट्रिंग को जोड़ने के लिए ''' .join' का उपयोग करें, न कि' + '।] (Http://stackoverflow.com/questions/1349311/python-string-join-is-faster-than-but-whats-wrong- यहाँ/1350289 # 1350289) – unutbu

उत्तर

13

and कभी भी मूर्ख को टाइपकास्ट नहीं करता है। इसके बजाय, if अभिव्यक्ति के परिणाम पर bool() पर कॉल करता है।

कोई व्यंजक (और or उस बात के लिए) and का उपयोग कर, शॉर्ट सर्किट यह निर्धारित कर सकते हैं जब कि अभिव्यक्ति सही है या पहले संकार्य के आधार पर गलत पर मूल्यांकन नहीं जाएंगे और अंतिम मूल्यांकन किया जाता मान देता है:

>>> 0 and 'string' 
0 
>>> 1 and 'string' 
'string' 
>>> 'string' or 10 
'string' 
>>> '' or 10 
10 

यह 'साइड-इफेक्ट' अक्सर पाइथन कोड में उपयोग किया जाता है। ध्यान दें कि not एक बूलियन मान लौटाता है। विवरण के लिए python documentation on boolean operators देखें।

प्रलेखन भी बताते हैं क्या, विभिन्न प्रकार के लिए एक True या False बराबर है, इस तरह के रूप None, 0, '' और खाली कंटेनर False किया जा रहा है का गठन किया जबकि बाकी सबसे सब कुछ True के बराबर है।

कस्टम वर्गों के लिए, आप .__nonzero__() method (रिटर्न True या False) या एक .__len__() method परिभाषित करने की जरूरत (रिटर्न एक पूर्णांक है, जहां 0False है और बाकी सब कुछ True है), उनके बूलियन बराबर प्रभावित करने के लिए, अन्यथा वे हमेशा हूँ True पर डिफ़ॉल्ट।

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