2012-04-19 21 views
5

स्टाइल गाइड http://www.python.org/dev/peps/pep-0008क्यों नहीं यह सच है == यह सच है:

के अंतिम बिंदु पढ़ता है ...

सही है या गलत का उपयोग कर == को बूलियन मूल्यों की तुलना करें।

क्यों?

संपादित बस यह स्पष्ट पूछ क्या im बनाने के लिए (और यह समस्या अपने आप का संकेत है), जब आप

if something: 
    print "something is true" 

बारे में आप एक बूलियन जो या आधार पर काम नहीं हो सकता है के लिए एक अंतर्निहित रूपांतरण कर रहे हैं क्या सही मतलब है। आईएमएचओ प्रोग्रामिंग के इस रूप को साइड इफेक्ट्स के कारण निराश कर दिया गया है।

numberOfApples = -1 
if numberOfApples: 
    print "you have apples" # is not what is intended. 

if numberOfApples == True: 
    print "you have apples" # is also not what is intended. 

iHaveApples = numberOfApples > 0 
if iHaveApples is True: # Edit: corrected this.. the "is" is better than the == 
    print "you have apples" # is correct. 

लागू रूपांतरण तार्किक त्रुटियों को छिपाते हैं। तो स्टाइल गाइड इसे क्यों प्रोत्साहित करता है?

+0

मुझे लगता है कि बूलियन परीक्षण के लिए सबसे अच्छी शैली स्टाइल गाइड में सबसे खराब लेबल है। यदि नंबरऑफ एप्पल सही है: यह स्पष्ट होगा कि संख्याऑफ एप्पल एक बूल नहीं है। –

+0

फिर यदि आप वास्तव में चाहते हैं तो तुलना करें x की प्रकार bool() है और यदि यह है, तो यह सही है या गलत –

+0

@PedroWerneck बिल्कुल सही है। तो स्टाइल गाइड यह कहने में गलत है कि बूल का परीक्षण करने का सबसे बुरा तरीका यह है कि अगर bool_type है [True | False]: क्योंकि यह वास्तव में सबसे अच्छा तरीका –

उत्तर

7

इसका मतलब है कि आप

if greeting: 
बजाय

लिखना चाहिए:

if greeting == True: 

इसी तरह, आप यह नहीं लिखना चाहिए या तो:

if (greeting == True) == True: 

अतिरिक्त परीक्षण बेमानी हैं और कोड में कोई भी मूल्य न जोड़ें, इसलिए उन्हें हटाया जाना चाहिए।

+3

यह आश्चर्यजनक है कि लोगों को बुलियन नहीं मिलते हैं। उदाहरण के लिए "बूल भविष्यवाणी() {अगर (हालत) सच हो जाती है, और झूठी वापसी;}" - क्या? यह बस "बूल भविष्यवाणी() {वापसी की स्थिति;}" लिखा जा सकता है! – Asik

+0

दुर्भाग्यवश, जब भाषा सत्यता/झूठ के लिए अन्य मूल्यों का समर्थन करती है, तो आपके द्वारा उपयोग किए जाने वाले सटीक कथन में आपके कार्यक्रम का अर्थ काफी हद तक बदल सकता है ... '__eq__',' __nonzero__' और '__len__' जैसे विशेष कार्य केवल चीजों को और खराब बनाते हैं (उपयोगी , हाँ, लेकिन कभी-कभी समस्याग्रस्त) – mgibsonbr

+2

@mgibsonbr आप एक बूलियन के मूल्य को मजबूर करने के लिए बस 'बूल' का उपयोग कर सकते हैं। – Marcin

1

क्योंकि यह अनावश्यक है।

if hasChildren: 

if hasChildren == True: 

रूप में ही है लेकिन खनन और पढ़ने में आसान है।

+0

यदि संख्याOfChildren: प्रिंट सही शून्य वापस आ जाएगा अगर उत्तर शून्य शून्य है। यहां तक ​​कि अगर यह नकारात्मक है। बूलियन के लिए लागू रूपांतरण के दुष्प्रभाव होते हैं और आमतौर पर निराश होते हैं। स्टाइल गाइड हालांकि बूल के निहित रूपांतरण को प्रोत्साहित कर रहा है। –

+0

@ पीटरमूर, आप स्टाइल गाइड को गलत समझ रहे हैं। 'अगर संख्याऑफ बच्चे> 0: 'पूरी तरह से पाइथोनिक है, हालांकि' if (numberOfChildren> 0) == सही:' नहीं है। –

+0

@ बागो मैं पूरी तरह से सहमत हूं अगर (संख्याऑफ चाइल्डर्न> 0) == सही: अनावश्यक है क्योंकि तुलनित्र ">" स्पष्ट रूप से बाईं तरफ एक बूल प्रकार बना देगा। हालांकि अगर अज्ञात_ प्रकार: स्टाइल गाइड के विपरीत "है" के साथ परीक्षण से कम सुरक्षित है। परीक्षण बूल "है" बूल बूल की तुलना में बेहतर है: या अगर बूल == बूल: क्योंकि आपको सत्य की ओवरलोडिंग के कारण गलत नहीं मिलेगा जो कि अजगर में होता है। वास्तव में मैं क्या कह रहा हूँ। –

2

आईएमएचओ एक स्टाइल गाइड का बिंदु कुछ सामान्य संरचनाओं को मानकीकृत करना है, इस तरह से समझ में आता है, इसलिए आप अंततः एक ही काम करने वाले जंगली असंतोषजनक बयान के साथ खत्म नहीं होंगे। अधिक, असामान्य रूप सुझाव दे सकते हैं कि प्रोग्रामर के पास कुछ अलग तरीके से काम करने का कोई कारण था, शायद वह कथन की तरह दिखने से कुछ अलग करने की कोशिश कर रहा था।

यदि आप किसी कथन की सत्यता/झूठ का परीक्षण करना चाहते हैं, तो बस कथन का उपयोग करें या इसे not से पहले करें। यदि आपको यह सुनिश्चित करना होगा कि कथन True या False (केवल एक सच्चाई/झूठा मूल्य नहीं) का मूल्यांकन करता है, तो आप statement is True का उपयोग कर सकते हैं - हालांकि शैली मार्गदर्शिका इसे हतोत्साहित करती है - या शायद इसके प्रकार की जांच करें (isinstance का उपयोग करके)। लेकिन यह आमतौर पर खराब डिज़ाइन होता है, आपको तब तक बचना चाहिए जब तक कि आपके पास ऐसा करने का कोई अच्छा कारण न हो।

statement == True का उपयोग कई कारणों से खतरनाक है: 1) केवल True के साथ काम करें, अन्य "सच्चाई" मानों (जैसे [1]) के साथ असफल रहा; 2) अप्रत्याशित परिणाम उत्पन्न कर सकता है यदि कथन द्वारा लौटाया गया मान __eq__ को फिर से परिभाषित करता है; 3) तर्कों का क्रम बदल दिया गया है, तो विभिन्न परिणाम पैदा कर सकते हैं।ध्यान दें कि अगर कथन का उपयोग केवल __nonzero__ या __len__ लागू करता है, लेकिन नियमित उपयोग के लिए आमतौर पर कोई समस्या नहीं है, तो कथन का उपयोग करके सत्य/झूठ के लिए एक अलग मूल्य भी लौटा सकता है।

कुछ दिखा कैसे चीजें में गड़बड़ अगर आप शैली से विचलित हो सकता है उदाहरण:

if True: print True # True 
if 1: print True # True 
if [1]: print True # True 

True is True # True 
1 is True # False 
[1] is True # False 

True == True # True 
1 == True # True 
[1] == True # False 

संपादित करें: कुछ और:

if 1: print True # True 
if 2: print True # True 

1 == True # True 
2 == True # False 

1 is True # False 
2 is True # False 

अद्यतन: @Marcin ने बताया के रूप में , True/False पर मूल्य को कॉरर्स करने के लिए आप bool का उपयोग कर सकते हैं, यह गारंटी देते हुए कि केवल वे मान मौजूद होंगे। उस फ़ंक्शन का परिणाम मान के डिफ़ॉल्ट सत्य/झूठ के अनुरूप है (इसलिए __nonzero__ और __len__ को ध्यान में रखा जाता है)। कुछ उदाहरण:

if bool(1): print True # True 
bool(1) == True  # True 
bool(1) is True  # True 

if bool(2): print True # True 
bool(2) == True  # True 
bool(2) is True  # True 

1 or 2    # 1 
1 and 2    # 2 
bool(1) or bool(2) # True 
bool(1) and bool(2) # True 

bool(1) == bool(2) # True 
bool(1) is bool(2) # True 
+0

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

+0

वह व्यक्तिपरक आईएमएचओ है, कुछ भाषाएं (पूर्व जावा) तर्क के साथ कड़े स्पष्ट रूपांतरण को प्रोत्साहित करती हैं कि यह त्रुटि के लिए विंडो को कम करती है, अन्य लोग भाषा अभिव्यक्ति को बढ़ाने के लक्ष्य के साथ डीडब्ल्यूआईएम व्यवहार को प्रोत्साहित करते हैं। यदि वे शून्य/गैर-शून्य हैं तो संख्याओं को झूठा/सत्य मानना ​​सी में एक सामान्य प्रथा है, खाली कंटेनरों (सूचियों, तारों, सेटों) का इलाज करना, क्योंकि लिस्प में झूठा सामान्य है, और दोनों प्रथाओं के फायदे और नुकसान हैं। महत्वपूर्ण बात यह है कि एक भाषा लगातार चुनी गई रणनीति को लागू करती है (उदाहरण के लिए जावास्क्रिप्ट, उदाहरण के लिए, जहां गलत है लेकिन [] सत्य है)। – mgibsonbr

+0

मुझे नहीं लगता कि बूल (अज्ञात_ टाइप) का उपयोग करना अज्ञात_टाइप "है" [झूठी | सच] का उपयोग करने के समान प्रभाव होगा उदाहरण के लिए यदि टी = -1 तो यह 0 = गलत 1 = सत्य के सम्मेलन से सच नहीं है प्रकार एक बूल है। तो परीक्षण एक बूल की स्थिति के परीक्षण में झूठे परिणाम देता है। –

0

प्रकार में:

# A, Good: 
if numberOfApples > 0: 
    print "you have apples" 

# B, Also good: 
iHaveApples = numberOfApples > 0 
if iHaveApples: 
    print "you have apples" 

# C, Bad: 
iHaveApples = numberOfApples > 0 
if iHaveApples == True: 
    print "you have apples" 

क्यों क्या तुमने कभी ए या बी से अधिक सी लेने हैं?

अद्यतन:

मुझे लगता है कि आप कुछ कोने मामलों से अधिक गोलियों पसीना आ रहे हैं, लेकिन अगर उन कोने मामलों अपने प्रोजेक्ट में कोई फर्क उचित तुलना का उपयोग करें। आम तौर पर हम iHaveApples के प्रकार के बारे में कुछ जानते हैं, उदाहरण के लिए हम जानते हैं कि यह > का उपयोग करके तुलना का परिणाम है। यह आपके कोड में उस जानकारी का उपयोग करने के लिए, उचित, और अच्छा अभ्यास है। यदि आप पूछ रहे हैं, "क्या होगा यदि मुझे लगता है कि यह एक बूल है और यह एक int या कुछ और हो जाता है।" मैं कहूंगा कि आपके कोड में एक बग है, आपको इसे ढूंढना चाहिए, इसे ठीक करना चाहिए, और यदि आप एक ही गलती फिर से करते हैं तो एक परीक्षा लिखें। रनटाइम पर अपनी गलतियों को ढूंढने के लिए पाइथन पर भरोसा न करें।

मैं जोर देंगे, और अगर आप चाहते हैं साबित करने के लिए आप पर छोड़ते हैं, कि if iHaveApples: बिल्कुल वैसा ही व्यवहार करती है, लेकिन तेजी से, जब आप निश्चित रूप से पता है कि iHaveApples एक bool है चलाता है if iHaveApples is True: के रूप में। अंततः मैं is का एक उदाहरण दूंगा, कम से कम मेरी राय में अवांछित व्यवहार का परिणाम होगा।

>>> import numpy 
>>> totalApples = numpy.sum([1, 2, 3]) == 6 
>>> totalApples 
True 
>>> totalApples is True 
False 

मैं तुम्हें यह पता लगाने क्यों कि अगर आप चाहते हैं (संकेत, type(totalApples) जाँच) काम नहीं करता दूँगा।

+1

मुझे लगता है कि सी भी सही नहीं है लेकिन यह == के बजाय "है" होना चाहिए। इसलिए यदि iHaveApples सत्य है तो इसे व्यक्त करने के किसी भी अन्य तरीके से अधिक सत्य होगा। मुझे निश्चित रूप से नहीं लगता कि यह शैली गाइड sugests के तरीके होना चाहिए। –

+1

बी वैसे अच्छा नहीं है जब तक आप यह सुनिश्चित न करें कि आप एक बूलियन की तुलना कर रहे हैं। आप कैसे जान सकते हैं कि अगर स्टेटमेंट में टाइप एक बूल है? अंतर्निहित रूपांतरण समस्या केवल अपने सिर को उठाती है यदि आपको लगता है कि आप एक बूल की तुलना करते हैं और यह बूल नहीं है। यही कारण है कि मैंने अपने उदाहरण के लिए नंबरऑफ एप्पल -1 पर चुना। और मैं भी तुलनात्मक के साथ एक बुलियन बनाया क्यों। स्टाइल गाइड स्पष्ट रूप से परीक्षण बूलियन मानों के बारे में बात कर रहा है और इसका परीक्षण सुरक्षित से कम है। –

+0

@ पीटर मीटर, मेरा अपडेट –

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