अजगर 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
।
इसका उपयोग नहीं करना बुद्धिमानी नहीं है।
is not
यह अपने आप में एक ऑपरेटर है। की तरह!=
। अगर आप पसंद करते हैंnot x is None
तो आपकाnot a == b
ओवर भी पसंद करना चाहिएa != b
।