अजगर 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।