Zawsze uważałem, że if not x is None
wersja jest bardziej przejrzysta, ale zarówno przewodnik po stylu Google, jak i PEP-8if x is not None
. Czy jest jakaś niewielka różnica w wydajności (zakładam, że nie) i czy jest jakikolwiek przypadek, w którym jedno naprawdę nie pasuje (co sprawia, że drugi jest wyraźnym zwycięzcą mojej konwencji)? *
* Mam na myśli dowolny singleton, a nie tylko None
.
... aby porównać singletony takie jak None. Zastosowanie jest lub nie jest.
python
coding-style
boolean-expression
orokusaki
źródło
źródło
is not
jest operatorem sam w sobie. Jak!=
. Jeśli wolisz,not x is None
to należy również swoje woląnot a == b
ponada != b
.not x is None
(odpowiedzi tutaj mnie przekonały) - warto jednak zauważyć, żenot a == b
jest to preferowany styl w Pythonie w porównaniu doa != b
.not a == b
naprawdę preferowany styl? Nigdy nie widziałem, aby robiono to w ten sposób i wszędzie wyglądam na ludzi, z których wszyscy korzystają!=
.!=
zamiast dwóch operatorównot
,==
.Odpowiedzi:
Nie ma różnicy w wydajności, ponieważ kompilują się do tego samego kodu bajtowego:
Stylistycznie staram się unikać
not x is y
. Chociaż kompilator będzie zawsze traktował to jakonot (x is y)
, ludzki czytelnik może źle zrozumieć konstrukcję jako(not x) is y
. Jeśli piszę,x is not y
nie ma dwuznaczności.źródło
x is (not y)
. Ale zazwyczaj zgadzam się z tobą z innych powodów.Zarówno Google, jak i przewodnik po stylu Python to najlepsza praktyka:
Używanie
not x
może powodować niepożądane wyniki.Patrz poniżej:
Możesz być zainteresowany tym, do których literałów są oceniane
True
False
w Pythonie lub w:Edytuj komentarz poniżej:
Właśnie wykonałem kilka testów.
not x is None
nie negujex
najpierw, a potem w porównaniu doNone
. W rzeczywistości wydaje się, żeis
operator ma wyższy priorytet, gdy jest używany w ten sposób:Dlatego
not x is None
właśnie, moim zdaniem, najlepiej unikać.Więcej edycji:
Właśnie wykonałem więcej testów i mogę potwierdzić, że komentarz bukzora jest prawidłowy. (Przynajmniej nie byłem w stanie udowodnić, że jest inaczej).
Oznacza to
if x is not None
, że ma dokładny wynik jakif not x is None
. Poprawiono mnie. Dzięki bukzor.Jednak moja odpowiedź nadal brzmi: użyj konwencjonalnego
if x is not None
.:]
źródło
Kod powinien być napisany tak, aby był zrozumiały dla programisty, a na drugim - kompilator lub interpreter. Konstrukcja „nie jest” przypomina angielski bardziej niż „nie jest”.
źródło
TLDR: Kompilator kodu bajtowego analizuje je oba
x is not None
- więc ze względu na czytelność użyjif x is not None
.Czytelność
Używamy Pythona, ponieważ cenimy takie rzeczy, jak czytelność dla człowieka, użyteczność i poprawność różnych paradygmatów programowania nad wydajnością.
Python optymalizuje czytelność, szczególnie w tym kontekście.
Analiza i kompilacja kodu bajtowego
Że
not
wiąże się słabiej niżis
, więc nie ma tu różnicy logicznej. Zobacz dokumentację :Jest
is not
to specjalnie przewidziane w Pythonie gramatyce jako poprawa czytelności dla języka:Jest to więc również element gramatyki.
Oczywiście nie jest tak samo parsowane:
Ale wtedy kompilator bajtów faktycznie przetłumaczy
not ... is
nais not
:Więc ze względu na czytelność i używanie języka zgodnie z przeznaczeniem, proszę użyć
is not
.Nie używać tego nie jest mądre.
źródło
not
Powiązania są słabsze niżis
, więc nie ma tutaj logicznej różnicy” - z wyjątkiem tego, że Python nie musi wymuszać tożsamości logicznej i algebraicznej (nie ma wewnętrznego powodu,(1 + 2)*3
aby oceniać to samo1*3 + 2*3
). Tutaj najwyraźniej Python oszukuje i optymalizujeUNARY_NOT
.Odpowiedź jest prostsza niż ludzie.
W każdym razie nie ma przewagi technicznej, a „x nie jest y” jest tym, czego wszyscy inni używają , co czyni go wyraźnym zwycięzcą. Nie ma znaczenia, że „wygląda bardziej jak angielski” czy nie; wszyscy go używają, co oznacza, że każdy użytkownik Pythona - nawet chińscy, których język Python nie przypomina - na pierwszy rzut oka zrozumie, gdzie nieco mniej powszechna składnia zajmie kilka dodatkowych cykli mózgowych.
Nie bądź inny tylko dlatego, że jesteś inny, przynajmniej w tej dziedzinie.
źródło
is not
Operatora jest bardziej korzystny niż negując wynikuis
przyczyn historycznych. „if x is not None:
” czyta podobnie jak angielski, ale „if not x is None:
” wymaga zrozumienia pierwszeństwa operatora i nie czyta jak po angielsku.Jeśli jest różnica w wydajności, moje pieniądze są na
is not
, ale prawie na pewno nie jest to motywacja do decyzji o preferowaniu tej techniki. Oczywiście byłoby to zależne od implementacji. Ponieważis
nie można go zastąpić, optymalizacja jakiegokolwiek rozróżnienia powinna być łatwa.źródło
Osobiście używam
który jest rozumiany natychmiastowo bez dwuznaczności przez wszystkich programistów, nawet tych, którzy nie są ekspertami w składni języka Python.
źródło
if not x is None
jest bardziej podobny do innych języków programowania, aleif x is not None
zdecydowanie brzmi dla mnie wyraźniej (i jest bardziej poprawny gramatycznie w języku angielskim).To powiedziawszy, wydaje mi się, że jest to dla mnie bardziej preferencja.
źródło
Wolałbym bardziej czytelną formę
x is not y
niż myślałem, jak w końcu napisać pierwszeństwo obsługi kodu operatorów, aby uzyskać znacznie bardziej czytelny kod.źródło