पायथन `यदि x कोई नहीं है` या `यदि x नहीं है तो` नहीं है?


745

मैंने हमेशा if not x is Noneसंस्करण के बारे में अधिक स्पष्ट होने के बारे में सोचा है , लेकिन Google की शैली मार्गदर्शिका और PEP-8 दोनों उपयोग करते हैं if x is not None। क्या कोई मामूली प्रदर्शन अंतर है (मैं नहीं मान रहा हूं), और क्या कोई ऐसा मामला है जहां कोई वास्तव में फिट नहीं है (दूसरे को मेरे सम्मेलन के लिए स्पष्ट विजेता बना)? *

* मैं किसी भी सिंगलटन का जिक्र कर रहा हूं, बजाय सिर्फ None

... एकल की तरह तुलना करने के लिए कोई नहीं। उपयोग है या नहीं है।


8
is notयह अपने आप में एक ऑपरेटर है। की तरह !=। अगर आप पसंद करते हैं not x is Noneतो आपका not a == bओवर भी पसंद करना चाहिए a != b
टॉमस गैंडर

@TomaszGandor अब मेरे पास इस बारे में कोई राय नहीं है not x is None(यहाँ उत्तर मुझे आश्वस्त करते हैं) - हालांकि, यह ध्यान देने योग्य है कि not a == bइसकी तुलना में पायथन में पसंदीदा शैली है a != b
ओरोकुसाकी

4
@orokusaki not a == bवास्तव में पसंदीदा शैली है? मैंने इसे कभी इस तरह से नहीं देखा है और हर जगह मैं सभी लोगों का उपयोग करता हूं !=
माइक - एसएमटी

2
@orokusaki में अजगर पठनीयता में गिना जाता है, तो यह एक पसंदीदा शैली एक ऑपरेटर का उपयोग करने के लिए है !=दो ऑपरेटरों के बजाय not, ==
जेजेकोमोन

जवाबों:


994

कोई प्रदर्शन अंतर नहीं है, क्योंकि वे एक ही बायोटेक पर संकलित हैं:

Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
...    return x is not None
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> def g(x):
...   return not x is None
...
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

स्थिर रूप से, मैं बचने की कोशिश करता हूं not x is y। हालांकि कंपाइलर हमेशा इसे ही मानेंगे not (x is y), लेकिन एक मानव पाठक निर्माण को गलत समझ सकता है (not x) is y। अगर मैं लिखता हूं x is not yतो कोई अस्पष्टता नहीं है।


103
जब तक कि एक ही मानव पाठक को यह नहीं लगता था x is (not y)। लेकिन मैं आपके अन्य तर्क के लिए आपसे सहमत हूं।
एटकॉइन

24
इसके अतिरिक्त "नहीं है" इस संदर्भ में कम अस्पष्ट है "अगर कोई नहीं है और बी कोई नहीं है:" बनाम "यदि कोई नहीं है और बी कोई नहीं है:"
गॉर्डन Wrigley

45
ऑपरेटर को "ऐंट" होना चाहिए
बीन

216

Google और Python का स्टाइल गाइड दोनों ही सबसे अच्छा अभ्यास है:

if x is not None:
    # Do something about x

उपयोग करने से not xअवांछित परिणाम हो सकते हैं।

निचे देखो:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

आप को देखने के लिए क्या शाब्दिक लिए मूल्यांकन किया जाता है दिलचस्पी हो सकती है Trueया Falseपायथन में:


नीचे टिप्पणी के लिए संपादित करें:

मैंने अभी कुछ और परीक्षण किया है। पहले और फिर की तुलना में not x is Noneनकारात्मक नहीं xहै None। वास्तव में, ऐसा लगता isहै कि इस तरह से इस्तेमाल किए जाने पर ऑपरेटर की उच्च प्राथमिकता है:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

इसलिए, not x is Noneसिर्फ, मेरी ईमानदार राय में, सबसे अच्छा बचा है।


अधिक संपादित करें:

मैंने अभी और परीक्षण किया है और पुष्टि कर सकता हूं कि bukzor की टिप्पणी सही है। (कम से कम, मैं इसे अन्यथा साबित करने में सक्षम नहीं था।)

इस साधन if x is not Noneका सटीक परिणाम है if not x is None। मुझे सही साबित होना है। धन्यवाद bukzor

हालांकि, मेरा जवाब अभी भी खड़ा है: पारंपरिक का उपयोग करेंif x is not None:]


130

कोड को प्रोग्रामर को समझने के लिए लिखा जाना चाहिए, और संकलक या दुभाषिया दूसरा। "नहीं है" का निर्माण अंग्रेजी से अधिक निकटता से है "नहीं" से।


33

अजगर if x is not Noneया if not x is None?

TLDR: बाइटकोड कंपाइलर उन दोनों को पार्स करता है x is not None- इसलिए पठनीयता के लिए, उपयोग करेंif x is not None

पठनीयता

हम पायथन का उपयोग करते हैं क्योंकि हम प्रदर्शन पर प्रोग्रामिंग की विभिन्न प्रतिमानों की मानवीय पठनीयता, उपयोगिता, और शुद्धता जैसी चीजों को महत्व देते हैं।

पायथन पठनीयता के लिए अनुकूलन करता है, विशेष रूप से इस संदर्भ में।

बाइटकोड को पार्स करना और संकलित करना

की तुलना में not अधिक कमजोर बांधता हैis , इसलिए यहां कोई तार्किक अंतर नहीं है। प्रलेखन देखें :

संचालक isऔरis notऑब्जेक्ट आइडेंटिटी के लिए टेस्ट: x is yसच है अगर और केवल एक्स और वाई एक ही ऑब्जेक्ट हैं। x is not yउलटा सत्य मूल्य देता है।

is notविशेष रूप से अजगर में के लिए प्रदान की जाती है व्याकरण भाषा के लिए एक पठनीयता सुधार के रूप में:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

और इसलिए यह व्याकरण का एकात्मक तत्व भी है।

बेशक, यह समान नहीं है:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

लेकिन फिर बाइट संकलक वास्तव में अनुवाद करेगा not ... isकरने के लिएis not :

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

तो पठनीयता के लिए और भाषा का उपयोग करना जैसा कि यह इरादा था, कृपया उपयोग करें is not

इसका उपयोग नहीं करना बुद्धिमानी नहीं है।


"की notतुलना में अधिक कमजोर बांधता है is, इसलिए यहां कोई तार्किक अंतर नहीं है" - सिवाय इसके कि अजगर को तार्किक और बीजगणितीय पहचान को लागू करने की आवश्यकता नहीं है ( (1 + 2)*3उसी के रूप में मूल्यांकन करने के लिए कोई आंतरिक कारण नहीं 1*3 + 2*3)। यहाँ जाहिरा तौर पर अजगर धोखा दे रहा है और UNARY_NOTदूर से अनुकूलन कर रहा है।
एलेक्सी

30

इसका उत्तर सरल है कि लोग इसे बना रहे हैं।

किसी भी तरह से कोई तकनीकी लाभ नहीं है, और "x y नहीं है" जो हर कोई उपयोग करता है , जो इसे स्पष्ट विजेता बनाता है। इससे कोई फर्क नहीं पड़ता कि यह "अंग्रेजी की तरह दिखता है" या नहीं; हर कोई इसका उपयोग करता है, जिसका अर्थ है कि पायथन के प्रत्येक उपयोगकर्ता - यहां तक ​​कि चीनी उपयोगकर्ता, जिनकी भाषा पायथन कुछ भी नहीं लगती है - इसे एक नज़र में समझेंगे, जहां थोड़ा कम आम वाक्यविन्यास कुछ अतिरिक्त मस्तिष्क चक्रों को पार्स करने के लिए ले जाएगा।

अलग होने के लिए अलग मत बनो, कम से कम इस क्षेत्र में।


11

is notऑपरेटर का परिणाम negating से अधिक पसंद किया जाता है isशैलीगत कारणों के लिए। " if x is not None:" अंग्रेजी की तरह ही पढ़ता है, लेकिन " if not x is None:" ऑपरेटर पूर्वता की समझ की आवश्यकता है और अंग्रेजी की तरह नहीं पढ़ता है।

यदि मेरे पैसे में कोई अंतर है is not, तो यह निश्चित रूप से उस तकनीक को पसंद करने के निर्णय के लिए प्रेरणा नहीं है। यह स्पष्ट रूप से कार्यान्वयन-निर्भर होगा। चूंकि isयह अतिश्योक्तिपूर्ण नहीं है, इसलिए किसी भी तरह से किसी भी भेद को अनुकूलित करना आसान होना चाहिए।


9

व्यक्तिगत रूप से, मैं उपयोग करता हूं

if not (x is None):

जिसे प्रत्येक प्रोग्रामर द्वारा अस्पष्टता के बिना तुरंत समझा जाता है, यहां तक ​​कि उन लोगों को भी जो पायथन सिंटैक्स में विशेषज्ञ नहीं हैं।


5
एक उचित तर्क जिससे मैं सहमत हूं, लेकिन मेरा मानना ​​है कि मुहावरेदार शैली का अनुसरण करने का तर्क अधिक मजबूत है।
क्लैके

2

if not x is Noneअन्य प्रोग्रामिंग भाषाओं के समान है, लेकिन if x is not Noneनिश्चित रूप से मेरे लिए अधिक स्पष्ट (और अंग्रेजी में अधिक व्याकरणिक रूप से सही है) लगता है।

यह कहा कि ऐसा लगता है कि यह मेरे लिए एक प्राथमिकता की बात है।


0

मैं अधिक पठनीय रूप को पसंद करूंगा x is not y जितना मैं सोचता हूं कि बहुत अधिक पठनीय कोड का उत्पादन करने के लिए ऑपरेटरों की पूर्ववर्ती हैंडलिंग कोड को कैसे लिखना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.