2010-10-19 11 views
435

में कोई भी परीक्षण नहीं, इनमें से कोई भी परीक्षण नहीं करता है।पायथन

if val != None: 

if not (val is None): 

if val is not None: 

कौन सा बेहतर है, और क्यों?

उत्तर

632
if val is not None: 
    # ... 

परीक्षण है कि एक चर None पर सेट नहीं है के लिए pythonic मुहावरा है। इस मुहावरे का उपयोग declaring keyword functions with default parameters के मामले में विशेष रूप से किया जाता है। पाइथन में is परीक्षण पहचान। क्योंकि चल रहे पायथन स्क्रिप्ट/प्रोग्राम में मौजूद None का एक और एक उदाहरण है, is इसके लिए इष्टतम परीक्षण है। Johnsyweb points out के रूप में, इस पर "प्रोग्रामिंग सिफारिशें" के तहत PEP 8 में चर्चा की गई है।

क्यों इस

if not (val is None): 
    # ... 

यह करने के लिए पसंद किया जाता है के रूप में बस Zen of Python का हिस्सा है: "। पठनीयता मायने रखता है" अच्छा पायथन अक्सर pseudocode के करीब है।

+38

भी, "नहीं है" इस उद्देश्य के लिए बनाए गए विशेष सेमेन्टिक्स हैं (यह अभिव्यक्तियों का निर्माण कैसे किया जाता है इसका तार्किक परिणाम नहीं है; "1 (कोई नहीं है)" और "1 कोई नहीं है" के दो अलग-अलग परिणाम हैं। –

+13

+1: मुझे यह संदर्भ पसंद आया - "अच्छा पायथन अक्सर अच्छे छद्म कोड के करीब होता है" – legesh

+1

"कोई भी नहीं" सही लौटाता है। दिलचस्प। – Ries

18

बाद के दो में से कोई, val के बाद से संभावित रूप से एक प्रकार है कि __eq__() को परिभाषित करता है सच वापस जाने के लिए जब None पारित हो सकता है।

+4

यही नहीं बल्कि नृशंस है != उपयोग कर रहा है '__eq __()' के व्यवहार, और कुछ मुझे नहीं माना जाता था। कोने के मामले को पकड़ने के लिए अच्छा जवाब। – gotgenes

74

से, प्रोग्रामिंग अनुशंसाएँ, PEP 8:

कोई नहीं की तरह एकमात्र करने के लिए तुलना हमेशा से किया जाना चाहिए 'है' या कभी नहीं समानता ऑपरेटरों 'नहीं है',।

इसके अलावा, लेखन से सावधान "अगर एक्स" जब आप वास्तव में मतलब "अगर एक्स कोई भी नहीं है" - जैसे परीक्षण करते समय कि कोई चर या तर्क जो पर डिफ़ॉल्ट है, कोई भी अन्य मूल्य पर सेट नहीं किया गया था। अन्य मान में (जैसे एक कंटेनर) हो सकता है जो एक बुलियन संदर्भ में गलत हो सकता है!

पीईपी 8 किसी भी पायथन प्रोग्रामर के लिए आवश्यक पढ़ना आवश्यक है।

+4

+1 - उस – user2314737

12

सवालों के इन प्रकार के साथ सबसे अच्छा शर्त वास्तव में क्या अजगर करता है देखने के लिए है। dis मॉड्यूल अविश्वसनीय रूप से जानकारीपूर्ण है:

>>> def f(val): 
... if val != None: 
...  return True 
... return False 
... 
>>> def g(val): 
... if not (val is None): 
...  return True 
... return False 
... 
>>> def h(val): 
... if val is not None: 
...  return True 
... return False 
... 
>>> import dis 
>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    3 (!=) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(g) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(h) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 

ध्यान दें कि पिछले दो मामलों के संचालन के उसी क्रम (अजगर not (val is None) पढ़ता है और is not ऑपरेटर का उपयोग करता है) के लिए कम। पहले किसी के साथ तुलना करते समय != ऑपरेटर का उपयोग करता है।

के रूप में अन्य उत्तर से कहा, जब कोई नहीं के साथ तुलना एक बुरा विचार

+0

के बारे में पता नहीं था betwen तुलना_op 9 और 3 में क्या अंतर है? – evolvedmicrobe