Hat Python so etwas wie eine leere Zeichenfolgenvariable, in der Sie Folgendes tun können:
if myString == string.empty:
Was ist die eleganteste Methode, um nach leeren Zeichenfolgenwerten zu suchen? Ich finde harte Codierung ""
jedes Mal für das Überprüfen einer leeren Zeichenfolge nicht so gut.
python
string
comparison-operators
Joan Venge
quelle
quelle
""
nicht so gut?Antworten:
Leere Zeichenfolgen sind "falsch", was bedeutet, dass sie in einem booleschen Kontext als falsch betrachtet werden. Sie können also einfach Folgendes tun:
Dies ist der bevorzugte Weg, wenn Sie wissen, dass Ihre Variable eine Zeichenfolge ist. Wenn Ihre Variable auch ein anderer Typ sein könnte, sollten Sie verwenden
myString == ""
. Weitere Werte, die in booleschen Kontexten falsch sind, finden Sie in der Dokumentation zum Testen von Wahrheitswerten .quelle
if not myString:
Blocks , wennmyString
warenNone
,0
,False
usw. Also , wenn Sie sicher sind , nicht das, was TypmyString
ist, sollten Sieif myString == "":
bestimmen, ob es eine leere Zeichenfolge ist im Gegensatz zu ein anderer falscher Wert.if myString == ...
könnten wir anstelle einer Kette von Ausdrückenif myString in (None, '')
oder per @Bartek,if myString in (None, '') or not myString.strip()
Ab PEP 8 im Abschnitt „Programmierempfehlungen“ :
Sie sollten also Folgendes verwenden:
oder:
Zur Verdeutlichung werden Sequenzen in oder in einem Booleschen Kontext ausgewertet , ob sie leer sind oder nicht. Sie sind nicht gleich zu oder .
False
True
False
True
quelle
x == False
. Aber meiner Meinung nach ist die Klarstellung angesichts der Zielgruppe immer noch willkommen.Der eleganteste Weg wäre wahrscheinlich, einfach zu überprüfen, ob es wahr oder falsch ist, z.
Möglicherweise möchten Sie jedoch Leerzeichen entfernen, weil:
Sie sollten diesbezüglich jedoch wahrscheinlich etwas expliziter sein, es sei denn, Sie wissen sicher, dass diese Zeichenfolge eine Validierung bestanden hat und auf diese Weise getestet werden kann.
quelle
Ich würde die Einheit vor dem Strippen testen. Außerdem würde ich die Tatsache verwenden, dass leere Zeichenfolgen False (oder Falsy) sind. Dieser Ansatz ähnelt Apaches StringUtils.isBlank oder Guavas Strings.isNullOrEmpty
Dies ist, was ich verwenden würde, um zu testen, ob eine Zeichenfolge entweder Keine ODER Leer ODER Leer ist:
Und das genaue Gegenteil, um zu testen, ob eine Zeichenfolge nicht None NOR Empty NOR Blank ist:
Prägnantere Formen des obigen Codes:
quelle
if mystring and not mystring.strip()
?string and not string.isspace()
?def isBlank(s): return not (s and s.strip())
unddef isNotBlank(s): return s and s.strip()
.Ich habe einmal etwas Ähnliches wie Barteks Antwort geschrieben und Javascript inspiriert:
Prüfung:
quelle
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
Der einzig wirklich solide Weg, dies zu tun, ist der folgende:
Alle anderen Lösungen haben mögliche Probleme und Randfälle, in denen die Prüfung fehlschlagen kann.
len(myString)==0
kann fehlschlagen, wennmyString
es sich um ein Objekt einer Klasse handelt, die vonstr
der__len__()
Methode erbt und diese überschreibt .Ebenso
myString == ""
undmyString.__eq__("")
kann fehlschlagen, wenn undmyString
überschrieben .__eq__()
__ne__()
Aus irgendeinem Grund wird
"" == myString
auch getäuscht, wennmyString
überschreibt__eq__()
.myString is ""
und"" is myString
sind gleichwertig. Sie schlagen beide fehl, wennmyString
es sich nicht um eine Zeichenfolge, sondern um eine Unterklasse von Zeichenfolgen handelt (beide werden zurückgegebenFalse
). Da es sich um Identitätsprüfungen handelt, ist der einzige Grund, warum sie funktionieren, dass Python String Pooling (auch als String Internment bezeichnet) verwendet, das dieselbe Instanz eines Strings verwendet, wenn dieser interniert ist (siehe hier: Warum werden Strings mit entweder '= verglichen? = 'oder' ist 'manchmal ein anderes Ergebnis erzeugen? ). Und""
ist von Anfang an in CPython interniertDas große Problem bei der Identitätsprüfung ist, dass die String-Internierung (soweit ich feststellen konnte) nicht standardisiert ist, welche Strings interniert werden. Das heißt, theoretisch
""
ist intern nicht notwendig und das ist implementierungsabhängig.Der einzige Weg, der wirklich nicht getäuscht werden kann, ist der eingangs erwähnte :
"".__eq__(myString)
. Da dies die__eq__()
Methode der leeren Zeichenfolge explizit aufruft , kann sie nicht durch Überschreiben von Methoden in myString getäuscht werden und funktioniert solide mit Unterklassen vonstr
.Auch das Verlassen auf die Falschheit einer Zeichenfolge funktioniert möglicherweise nicht, wenn das Objekt seine
__bool__()
Methode überschreibt .Dies ist nicht nur eine theoretische Arbeit, sondern könnte auch für den realen Gebrauch relevant sein, da ich zuvor Frameworks und Bibliotheken gesehen habe, deren Unterklassen
str
und deren Verwendung dortmyString is ""
möglicherweise eine falsche Ausgabe zurückgeben.Außerdem ist das Vergleichen von Strings
is
im Allgemeinen eine ziemlich böse Falle, da es manchmal richtig funktioniert, aber nicht zu anderen Zeiten, da das Pooling von Strings ziemlich seltsamen Regeln folgt.In den meisten Fällen funktionieren jedoch alle genannten Lösungen ordnungsgemäß. Dies ist Post ist meist akademische Arbeit.
quelle
Leere oder leere Zeichenfolge testen (kürzerer Weg):
quelle
myString = None
, wird eine Ausnahme ausgelöst. Verwenden Sie besser die Antwort vonWenn Sie zwischen leeren und Null-Zeichenfolgen unterscheiden möchten, würde ich die Verwendung vorschlagen
if len(string)
, andernfalls würde ich die Verwendung einfachif string
so vorschlagen, wie andere gesagt haben. Die Einschränkung bezüglich Zeichenfolgen voller Leerzeichen gilt jedoch weiterhin. Vergessen Sie es also nichtstrip
.quelle
if stringname:
gibt ein,false
wenn die Zeichenfolge leer ist. Einfacher geht es wohl nicht.quelle
quelle
a='a'
, würden Sie erhaltena.isspace() -> False
, abera
nicht auf diesem Konto wäre eine leere Zeichenfolge.Clean Code-Ansatz
Dies zu tun:
foo == ""
ist eine sehr schlechte Praxis.""
ist ein magischer Wert. Sie sollten niemals gegen magische Werte prüfen (besser bekannt als magische Zahlen ).Was Sie tun sollten, ist mit einem beschreibenden Variablennamen zu vergleichen.
Beschreibende Variablennamen
Man könnte denken, dass "empty_string" ein beschreibender Variablenname ist. Ist es nicht .
Bevor Sie loslegen und
empty_string = ""
denken, Sie hätten einen großartigen Variablennamen, mit dem Sie vergleichen können. Dies ist nicht das, was "beschreibender Variablenname" bedeutet.Ein guter beschreibender Variablenname basiert auf seinem Kontext. Sie müssen darüber nachdenken, was die leere Zeichenfolge ist .
Einfaches Beispiel für ein Formularfeld
Sie erstellen ein Formular, in das ein Benutzer Werte eingeben kann. Sie möchten überprüfen, ob der Benutzer etwas geschrieben hat oder nicht.
Ein guter Variablenname kann sein
not_filled_in
Dies macht den Code sehr lesbar
Beispiel für eine gründliche CSV-Analyse
Sie analysieren CSV-Dateien und möchten, dass die leere Zeichenfolge als analysiert wird
None
(Da CSV vollständig textbasiert ist, kann es nicht darstellen
None
ohne Verwendung vordefinierter Schlüsselwörter dargestellt werden.)Ein guter Variablenname kann sein
CSV_NONE
Dies erleichtert das Ändern und Anpassen des Codes, wenn Sie eine neue CSV-Datei haben, die
None
mit einer anderen Zeichenfolge als dargestellt wird""
Es gibt keine Fragen darüber, ob dieser Code korrekt ist. Es ist ziemlich klar, dass es tut, was es tun sollte.
Vergleichen Sie dies mit
Die erste Frage lautet hier: Warum verdient die leere Zeichenfolge eine besondere Behandlung?
Dies würde zukünftigen Codierern mitteilen, dass eine leere Zeichenfolge immer als betrachtet werden sollte
None
.Dies liegt daran, dass Geschäftslogik (welcher CSV-Wert sein sollte
None
) mit Codeimplementierung gemischt wird (womit vergleichen wir eigentlich)Es muss eine Trennung der Bedenken zwischen den beiden geben.
quelle
""
ist kein Zauber Wert, gleich wieTrue
,False
oderNone
sind nicht magische Werte.Wie wäre es damit? Vielleicht ist es nicht "das eleganteste", aber es scheint ziemlich vollständig und klar zu sein:
quelle
Antwort auf @ 1290. Es gibt leider keine Möglichkeit, Blöcke in Kommentaren zu formatieren. Der
None
Wert ist in Python keine leere Zeichenfolge und (Leerzeichen) auch nicht. Die Antwort von Andrew Clark ist die richtige :if not myString
. Die Antwort von @rouble ist anwendungsspezifisch und beantwortet die Frage des OP nicht. Sie werden in Schwierigkeiten geraten, wenn Sie eine eigenartige Definition einer "leeren" Zeichenfolge übernehmen. Insbesondere ist das Standardverhalten, dasstr(None)
erzeugt'None'
, eine nicht leere Zeichenfolge.Wenn Sie jedoch
None
und (Leerzeichen) als "leere" Zeichenfolgen behandeln müssen, ist dies ein besserer Weg:Beispiele:
Erfüllt die @ problem-Anforderungen, ohne das erwartete
bool
Verhalten von Zeichenfolgen zu beeinträchtigen .quelle
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Ich finde das elegant, da es sicherstellt, dass es sich um eine Zeichenfolge handelt und deren Länge überprüft:
quelle
-O
FlagPYTHONOPTIMIZE
drücken oder die env-Variable setzen.Eine andere einfache Möglichkeit könnte darin bestehen, eine einfache Funktion zu definieren:
quelle
Dieser Ausdruck gilt für leere Zeichenfolgen. Nicht leere Zeichenfolgen, Keine und Nicht-Zeichenfolgen-Objekte erzeugen alle False, mit der Einschränkung, dass Objekte __str__ überschreiben können, um diese Logik durch Rückgabe eines falschen Werts zu vereiteln.
quelle
Möglicherweise sehen Sie sich diese Zuweisung eines leeren Werts oder einer leeren Zeichenfolge in Python an
Hier geht es darum, leere Zeichenfolgen zu vergleichen. Anstatt also mit auf Leere zu
not
testen, können Sie testen, ob Ihre Zeichenfolge der leeren Zeichenfolge mit""
der leeren Zeichenfolge entspricht ...quelle
für diejenigen, die ein Verhalten wie den Apache StringUtils.isBlank oder Guava Strings.isNullOrEmpty erwarten :
quelle
Wenn Sie eine Datei zeilenweise lesen und feststellen möchten, welche Zeile leer ist, stellen Sie sicher, dass Sie sie verwenden
.strip()
, da die "leere" Zeile ein neues Zeilenzeichen enthält:quelle
quelle
Wenn Sie nur verwenden
Es ist nicht möglich, eine boolesche Variable
False
von einer leeren Zeichenfolge zu unterscheiden''
:Wenn Sie Ihrem Skript jedoch eine einfache Bedingung hinzufügen, wird der Unterschied gemacht:
quelle
Für den Fall, dass dies für jemanden nützlich ist, ist hier eine schnelle Funktion, die ich entwickelt habe, um leere Zeichenfolgen durch N / A in Listen von Listen zu ersetzen (Python 2).
Dies ist nützlich, um Listen mit Listen in einer MySQL-Datenbank zu veröffentlichen, die für bestimmte Felder keine Leerzeichen akzeptiert (Felder, die im Schema als NN markiert sind. In meinem Fall war dies auf einen zusammengesetzten Primärschlüssel zurückzuführen).
quelle
Ich habe mit Zeichenfolgen wie '', '', '\ n' usw. experimentiert. Ich möchte, dass isNotWhitespace genau dann True ist, wenn die Variable foo eine Zeichenfolge mit mindestens einem Nicht-Leerzeichen ist. Ich benutze Python 3.6. Folgendes habe ich erreicht:
Wickeln Sie dies bei Bedarf in eine Methodendefinition ein.
quelle
Wie oben angegeben, aber mit Fehler.
quelle
""
und" "
und False für zurück"a"
(genau wie erwartet). Ihr Code gibt dasselbe zurück, mit Ausnahme der leeren Zeichenfolge, die True zurückgibt, was nicht der Fall sein sollte.