Ich habe immer gedacht, dass die if not x is None
Version klarer ist, aber Googles Styleguide und PEP-8 verwenden beide if x is not None
. Gibt es einen kleinen Leistungsunterschied (ich nehme nicht an) und gibt es einen Fall, in dem einer wirklich nicht passt (was den anderen zu einem klaren Gewinner für meinen Kongress macht)? *
* Ich beziehe mich eher auf einen Singleton als nur auf einen None
.
... um Singletons wie None zu vergleichen. Verwendung ist oder nicht.
python
coding-style
boolean-expression
Orokusaki
quelle
quelle
is not
ist ein eigenständiger Betreiber. Wie!=
. Wenn Sie es vorziehen ,not x is None
dann sollte Ihr auch liebernot a == b
übera != b
.not x is None
(die Antworten hier haben mich überzeugt) - es ist jedoch erwähnenswert, dass diesnot a == b
der bevorzugte Stil in Python im Vergleich zu ista != b
.not a == b
wirklich der bevorzugte Stil? Ich habe es noch nie so gesehen und überall sehe ich Menschen, die alle benutzen!=
.!=
anstelle von zwei Operatorennot
,==
.Antworten:
Es gibt keinen Leistungsunterschied, da sie mit demselben Bytecode kompiliert werden:
Stilistisch versuche ich zu vermeiden
not x is y
. Obwohl der Compiler es immer als behandeltnot (x is y)
, kann ein menschlicher Leser das Konstrukt als falsch verstehen(not x) is y
. Wenn ich schreibe,x is not y
gibt es keine Mehrdeutigkeit.quelle
x is (not y)
. Aber ich stimme Ihnen in Bezug auf Ihre anderen Überlegungen eher zu.Der Styleguide von Google und Python ist die beste Vorgehensweise:
Die Verwendung
not x
kann zu unerwünschten Ergebnissen führen.Siehe unten:
Vielleicht interessiert es Sie, welche Literale für
True
oderFalse
in Python ausgewertet werden :Für Kommentar unten bearbeiten:
Ich habe nur noch ein paar Tests gemacht.
not x is None
negiert nichtx
zuerst und vergleicht dann mitNone
. Tatsächlich scheint deris
Operator bei dieser Verwendung eine höhere Priorität zu haben:Daher
not x is None
wird meiner ehrlichen Meinung nach nur am besten vermieden.Weitere bearbeiten:
Ich habe gerade mehr Tests durchgeführt und kann bestätigen, dass Bukzors Kommentar korrekt ist. (Zumindest konnte ich es nicht anders beweisen.)
Dies bedeutet
if x is not None
das genaue Ergebnis alsif not x is None
. Ich stehe korrigiert. Danke Bukzor.Meine Antwort lautet jedoch weiterhin: Verwenden Sie das Konventionelle
if x is not None
.:]
quelle
Der Code sollte so geschrieben werden, dass er zuerst für den Programmierer und dann für den Compiler oder Interpreter verständlich ist. Das Konstrukt "ist nicht" ähnelt eher dem Englischen als "nicht ist".
quelle
TLDR: Der Bytecode-Compiler analysiert beide,
x is not None
um die Lesbarkeit zu verbessernif x is not None
.Lesbarkeit
Wir verwenden Python, weil wir Dinge wie die menschliche Lesbarkeit, Benutzerfreundlichkeit und Korrektheit verschiedener Paradigmen der Programmierung gegenüber der Leistung schätzen.
Python optimiert die Lesbarkeit, insbesondere in diesem Zusammenhang.
Analysieren und Kompilieren des Bytecodes
Das
not
bindet schwächer alsis
, daher gibt es hier keinen logischen Unterschied. Siehe die Dokumentation :Das
is not
ist in der Python- Grammatik speziell als Lesbarkeitsverbesserung für die Sprache vorgesehen:Und so ist es auch ein einheitliches Element der Grammatik.
Natürlich wird es nicht gleich analysiert:
Aber dann übersetzt der Byte-Compiler das tatsächlich
not ... is
inis not
:Um die Lesbarkeit zu verbessern und die Sprache so zu verwenden, wie sie beabsichtigt war, verwenden Sie bitte
is not
.Es nicht zu benutzen ist nicht klug.
quelle
not
bindet schwächer alsis
, daher gibt es hier keinen logischen Unterschied" - außer dass Python keine logischen und algebraischen Identitäten erzwingen muss, um zu halten (kein wesentlicher Grund(1 + 2)*3
, dasselbe zu bewerten wie1*3 + 2*3
). Hier betrügt und optimiert Python anscheinendUNARY_NOT
.Die Antwort ist einfacher als die Leute es machen.
In beiden Fällen gibt es keinen technischen Vorteil, und "x ist nicht y" wird von allen anderen verwendet , was es zum klaren Gewinner macht. Es spielt keine Rolle, ob es "eher wie Englisch aussieht" oder nicht; Jeder verwendet es, was bedeutet, dass jeder Benutzer von Python - selbst chinesische Benutzer, deren Sprache Python nicht ähnelt - es auf einen Blick verstehen wird, wobei die etwas weniger verbreitete Syntax einige zusätzliche Gehirnzyklen zum Parsen benötigt.
Sei nicht anders, nur um anders zu sein, zumindest in diesem Bereich.
quelle
Der
is not
Bediener wirdis
aus stilistischen Gründen dem Negieren des Ergebnisses vorgezogen . "if x is not None:
" liest sich genauso wie Englisch, "if not x is None:
" erfordert jedoch Verständnis für die Priorität des Operators und liest sich nicht wie Englisch.Wenn es einen Leistungsunterschied gibt, auf dem mein Geld liegt
is not
, ist dies mit ziemlicher Sicherheit nicht die Motivation für die Entscheidung, diese Technik zu bevorzugen. Es wäre offensichtlich implementierungsabhängig. Dais
es nicht überschreibbar ist, sollte es sowieso einfach sein, eine Unterscheidung zu optimieren.quelle
Persönlich benutze ich
Dies wird von jedem Programmierer sofort verstanden, auch wenn er nicht mit der Python-Syntax vertraut ist.
quelle
if not x is None
ist anderen Programmiersprachen ähnlicher,if x is not None
klingt aber für mich definitiv klarer (und ist auf Englisch grammatikalisch korrekter).Das heißt, es scheint mir eher eine Präferenzsache zu sein.
quelle
Ich würde die besser lesbare Form vorziehen,
x is not y
als ich mir vorstellen würde, wie man irgendwann die Priorität der Operatoren für die Codebehandlung schreibt, um viel besser lesbaren Code zu erzeugen.quelle