Python if x is not None
veya if not x is None
?
TLDR: Baytkodu derleyicisi ikisini de ayrıştırır x is not None
- böylece okunabilirlik için kullanın if x is not None
.
Okunabilirlik
Python'u kullanıyoruz çünkü insan tarafından okunabilirlik, kullanılabilirlik ve çeşitli programlama paradigmalarının performans üzerinde doğruluğu gibi şeylere değer veriyoruz.
Python, özellikle bu bağlamda okunabilirliği optimize eder.
Bayt Kodunu Ayrıştırma ve Derleme
not
Daha zayıf bağlandığı daha is
, bu nedenle burada mantıklı bir fark yoktur. Belgelere bakın :
İşleçler is
ve is not
nesne kimliği testi: x is y
yalnızca x ve y aynı nesne ise doğrudur. x is not y
ters doğruluk değeri verir.
is not
Özellikle Python içinde sağlanır dilbilgisi dil için bir okunabilirliği iyileştirme olarak:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Ve bu da dilbilgisinin üniter bir öğesidir.
Tabii ki, aynı ayrıştırılmaz:
>>> 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())]))"
Ama sonra bayt derleyici aslında çevirecek not ... is
için 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
Bu nedenle, okunabilirlik ve dili amaçlandığı gibi kullanmak için lütfen kullanın is not
.
Kullanmamak akıllıca değil .
is not
kendi başına bir operatördür. Gibi!=
. İsterseniznot x is None
o zaman senin de tercih etmeliyiznot a == b
üzerindea != b
.