Python: wenn nicht val, vs wenn val ist Keine
Habe ich immer codiert, im Stil von if not value
jedoch ein paar guides haben, um meine Aufmerksamkeit gebracht, dass während dieser Stil funktioniert, scheint es 2 mögliche Probleme:
- Es ist nicht vollständig lesbar;
if value is None
ist sicherlich verständlicher. - Dies kann Auswirkungen haben später (und verursachen subtile bugs), da Dinge wie
[]
und0
bewerten zuFalse
als gut.
Ich bin auch ab der Anwendung dieser Idee auf andere Vergleiche, etwa:
if not value
vsif value is False
if not value
vsif value is []
Und so geht die Liste...
Die Frage ist, wie weit wollen Sie gehen mit dem Prinzip? Wo die Grenze zu ziehen, während Ihr code sicher?
Sollte ich immer die if value is None
Stil, egal was ist?
InformationsquelleAutor der Frage John Doe | 2011-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einen Vergleich zu Keiner wenn es das ist, was Sie wollen. Verwenden Sie "wenn nicht Wert", wenn Sie nur wollen, um zu überprüfen, ob der Wert als false (leere Liste, none, false).
Finde ich "nicht Wert" zu sein-cleaner suchen und Pythonic.
Auch, seien Sie vorsichtig mit Listen. Sie sollten nicht verwenden, ist beim Vergleich für eine leere Liste. Wenn Sie wissen, dass Sie eine Liste verwenden "wenn ", um zu überprüfen, ob es irgendeinen Inhalt (oder len()). Geben Sie diese in den interpreter:
Dies ist, weil die temporäre Liste, die Sie gerade gemacht hat, eine andere Adresse im Speicher als die, die gespeichert sind in 'a'. Sie nicht sehen, diese mit None, False, oder True, da dies alles sind Werte, die sind singletons (Sie beziehen sich alle auf den gleichen Abschnitt des Speichers), so dass mit dem 'ist' - Schlüsselwort funktioniert.
Finden Sie auch, dass CPython Praktikanten Saiten, so dass die folgenden Werke.
Sollten Sie nicht auf diese angewiesen sind. Es ist eine Implementierung detail, und dies nicht angegeben wird, funktioniert mit jeder version von Python.
InformationsquelleAutor der Antwort Jonathan Sternberg
Nicht. Wenn Sie wollen, um code auszuführen, wenn der Wert false ist, aber nicht
None
würde scheitern schrecklich.Verwenden
is None
wenn Sie die überprüfung für die Identität mit derNone
Objekt. Verwendennot value
wenn Sie wollen einfach nur den Wert auf "False".InformationsquelleAutor der Antwort geoffspear
Ihre Nutzung der
is
- operator ist ein wenig problematisch.if value is []
wird immer falsch sein, zum Beispiel, weil keine zwei aktiven Listen die gleiche Identität haben. Es funktioniert Super mitNone
weilNone
ist ein singleton (alle Verweise aufNone
sind das gleiche Objekt), aber für andere Vergleiche, verwenden Sie==
.Jedoch
if value
undif not value
sind perfekt lesbar und nützlich. IMHO gibt es keine Notwendigkeit, um genauer zu sein, es sei denn Sie brauchen, zur Behandlung von verschiedenen Arten von truthy oder falsy-Werte anders, als zum Beispiel die Unterscheidung zwischen 0 undNone
.InformationsquelleAutor der Antwort kindall
Meine Antwort ist einfach, denn es gilt für die meisten Programmier-Probleme: versuchen Sie nicht, etwas zu schreiben, das einfach nur funktioniert. Versuchen Sie, drücken Sie Ihre Absicht so klar wie möglich. Wenn Sie möchten, um zu überprüfen, ob ein Wert falsch ist, verwenden Sie
if not value
. Wenn Sie prüfen möchtenNone
schreiben Sie es nach unten. Es hängt immer von der situation und deinem Urteil.Sollten Sie nicht versuchen, um Regeln zu finden, die angewendet werden können, ohne zu denken. Wenn Sie finden diese Regeln, es ist ein job für einen computer. Noch für einen Menschen! 😉
InformationsquelleAutor der Antwort Achim
ist in Ordnung und "pythonic". Es nicht zu subtilen bugs, die Regeln sind explizit und (finde ich) leicht zu verstehen.
Wenn Sie brauchen, um zu unterscheiden zwischen Falschen und Keine, wie von Ihnen erwähnt verwenden:
Ich finde das obige selten, aber notwendig.
Im Allgemeinen ist es jedoch bevorzugt, um positive Bedingungen. Sie sind einfacher zu verstehen, auf einen Blick und gut halten, da die Komplexität erhöht (wie es immer scheint).
InformationsquelleAutor der Antwort Gringo Suave