Python if x is not None
atau 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 is
dan is not
uji untuk identitas objek: x is y
benar jika dan hanya jika x dan y adalah objek yang sama. x is not y
menghasilkan nilai kebenaran terbalik.
Secara is not
khusus 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 ... is
ke 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 not
adalah operator di dalamnya sendiri. Seperti!=
. Jika Anda sukanot x is None
maka Anda juga harus memilihnot a == b
lebiha != b
.