Python if x is not Noneatau if not x is None?
TLDR: Compiler bytecode mem-parsing mereka berdua x is not None- jadi demi keterbacaan, gunakan if x is not None.
Keterbacaan
Kami menggunakan Python karena kami menghargai hal-hal seperti keterbacaan manusia, kemampuan penggunaan, dan kebenaran berbagai paradigma pemrograman dibandingkan kinerja.
Python mengoptimalkan keterbacaan, terutama dalam konteks ini.
Parsing dan Kompilasi Bytecode
The not mengikat lebih lemah dari is, sehingga tidak ada perbedaan logis di sini. Lihat dokumentasi :
Operator isdan is notuji untuk identitas objek: x is ybenar jika dan hanya jika x dan y adalah objek yang sama. x is not ymenghasilkan nilai kebenaran terbalik.
Secara is notkhusus disediakan dalam tata bahasa Python sebagai peningkatan keterbacaan untuk bahasa:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Dan itu juga merupakan elemen kesatuan dari tata bahasa juga.
Tentu saja, tidak diuraikan sama:
>>> 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())]))"
Tetapi kemudian byte compiler akan menerjemahkan not ... iske 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
Jadi demi keterbacaan dan penggunaan bahasa seperti yang dimaksudkan, silakan gunakan is not.
Untuk tidak menggunakannya itu tidak bijaksana.
is notadalah operator di dalamnya sendiri. Seperti!=. Jika Anda sukanot x is Nonemaka Anda juga harus memilihnot a == blebiha != b.