Hat Python so etwas wie eine leere String-Variable, wo Sie Folgendes tun können:
if myString == string.empty:
Unabhängig davon, was ist der eleganteste Weg, um nach leeren Zeichenfolgenwerten zu suchen? Ich finde Hardcoding "" jedes Mal zum Überprüfen einer leeren Zeichenfolge nicht so gut.
Wie ist "" nicht so gut?
– Kein Name
8. Februar 20 um 23:19 Uhr
Andreas Clark
Leere Strings sind “falsch” (Python 2 oder Python 3 Referenz), was bedeutet, dass sie in einem booleschen Kontext als falsch betrachtet werden, also können Sie einfach Folgendes tun:
if not myString:
Dies ist der bevorzugte Weg, wenn Sie wissen, dass Ihre Variable ein String ist. Wenn Ihre Variable auch einen anderen Typ haben könnte, sollten Sie verwenden myString == "". Siehe die Dokumentation auf Wahrheitswertprüfung für andere Werte, die in booleschen Kontexten falsch sind.
Seien Sie vorsichtig, da auch viele andere Dinge falsch sind.
– Ignacio Vazquez-Abrams
5. März 12 um 20:11 Uhr
Ich habe noch nie von dem Begriff falsch gehört. Bedeutet es, dass es falsch zurückgibt?
– Joan Venge
5. März 12 um 20:15 Uhr
@Joan: Es wird in einem booleschen Kontext als falsch ausgewertet.
– Ignacio Vazquez-Abrams
5. März 12 um 20:16 Uhr
OP möchte wissen, ob die Variable eine leere Zeichenfolge ist, aber Sie würden auch die eingeben if not myString: blockieren, wenn myString war None, 0, False usw. Wenn Sie sich also nicht sicher sind, welcher Typ myString ist, sollten Sie verwenden if myString == "": um festzustellen, ob es sich um eine leere Zeichenfolge im Gegensatz zu einem anderen falschen Wert handelt.
– Andreas Clark
7. August 13 um 16:08 Uhr
@AndrewClark, für einen solchen Fall anstelle einer Kette von if myString == ... Ausdrücke, die wir verwenden könnten if myString in (None, '') oder per @Bartek, if myString in (None, '') or not myString.strip()
Verwenden Sie für Sequenzen (Strings, Listen, Tupel) die Tatsache, dass leere Sequenzen falsch sind.
Sie sollten also verwenden:
if not some_string:
oder:
if some_string:
Nur zur Verdeutlichung, Sequenzen sind ausgewertet zu False oder True in einem booleschen Kontext, ob sie leer sind oder nicht. Sie sind nicht gleich zu False oder True.
PS: Zur Verteidigung des PEP könnte man argumentieren, dass “x ist falsch” (Kleinbuchstaben falsch) bedeutet bereits das, anstatt Bedeutung x == False. Aber IMHO ist die Klarstellung angesichts der Zielgruppe immer noch willkommen.
– MestreLion
12. März 16 um 16:24 Uhr
Bartek
Der eleganteste Weg wäre wahrscheinlich, einfach zu prüfen, ob es wahr oder falsch ist, z.
if not my_string:
Möglicherweise möchten Sie jedoch Leerzeichen entfernen, weil:
Sie sollten dies jedoch wahrscheinlich etwas expliziter machen, es sei denn, Sie wissen sicher, dass diese Zeichenfolge eine Art Validierung bestanden hat und eine Zeichenfolge ist, die auf diese Weise getestet werden kann.
Rubel
Ich würde das Nichts vor dem Strippen testen. Außerdem würde ich die Tatsache nutzen, dass leere Zeichenfolgen False (oder Falsy) sind. Dieser Ansatz ist ähnlich wie Apaches StringUtils.isBlank oder Guavas Strings.isNullOrEmpty
Dies ist, was ich verwenden würde, um zu testen, ob eine Zeichenfolge entweder None ODER Empty OR Blank ist:
def isBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return False
#myString is None OR myString is empty or blank
return True
Und das genaue Gegenteil zum Testen, ob eine Zeichenfolge nicht None NOR Empty NOR Blank ist:
def isNotBlank (myString):
if myString and myString.strip():
#myString is not None AND myString is not empty or blank
return True
#myString is None OR myString is empty or blank
return False
Kürzere Formen des obigen Codes:
def isBlank (myString):
return not (myString and myString.strip())
def isNotBlank (myString):
return bool(myString and myString.strip())
Gewölbe
Ich habe einmal etwas Ähnliches wie Barteks Antwort geschrieben und von Javascript inspiriert:
def is_not_blank(s):
return bool(s and not s.isspace())
AttributeError: 'NoneType' object has no attribute 'strip'
– Gewölbe
3. März 20 um 13:04 Uhr
s.strip() weist einen neuen String zu, was reine Verschwendung ist. Benutzen string.isspace()
– Clemens
22. Juni 2020 um 15:27 Uhr
"".isspace() ist False
– Danon
17. Juni 21 um 13:57 Uhr
@ Danon wird den ersten Test nicht bestehen s and und wird kurzschließen.
– Alexander Suraphel
18. November 21 um 13:07 Uhr
Dakkaron
Der einzige wirklich solide Weg, dies zu tun, ist der folgende:
if "".__eq__(myString):
Alle anderen Lösungen haben mögliche Probleme und Grenzfälle, in denen die Prüfung fehlschlagen kann.
len(myString)==0 kann scheitern, wenn myString ist ein Objekt einer Klasse, die erbt von str und überschreibt die __len__() Methode.
Ähnlich myString == "" und myString.__eq__("") kann scheitern, wenn myString überschreibt __eq__() und __ne__().
Aus irgendeinem Grund "" == myString wird auch getäuscht, wenn myString überschreibt __eq__().
myString is "" und "" is myString sind gleichwertig. Sie werden beide scheitern, wenn myString ist eigentlich keine Zeichenfolge, sondern eine Unterklasse von Zeichenfolge (beide werden zurückgegeben False). Da es sich um Identitätsprüfungen handelt, funktionieren sie nur deshalb, weil Python String Pooling (auch als String Internment bezeichnet) verwendet, das dieselbe Instanz eines Strings verwendet, wenn es interniert ist (siehe hier: Warum funktioniert der Vergleich von Strings entweder mit ‘= =’ oder ‘ist’ führen manchmal zu einem anderen Ergebnis?). Und "" ist von Anfang an in CPython interniert
Das große Problem bei der Identitätsprüfung ist, dass String Internment (soweit ich das feststellen konnte) nicht standardisiert ist, welche Strings interniert werden. Das heißt, theoretisch "" ist nicht notwendigerweise interniert und das ist implementierungsabhängig.
Die einzige Möglichkeit, dies wirklich nicht zu täuschen, ist die eingangs erwähnte: "".__eq__(myString). Da dies explizit die ruft __eq__() Methode des leeren Strings kann nicht durch Überschreiben von Methoden in myString getäuscht werden und arbeitet solide mit Unterklassen von str.
Auch das Verlassen auf die Falschheit einer Zeichenfolge funktioniert möglicherweise nicht, wenn das Objekt sie überschreibt __bool__() Methode.
Dies ist nicht nur theoretische Arbeit, sondern könnte tatsächlich in der realen Verwendung relevant sein, da ich gesehen habe, wie Frameworks und Bibliotheken Unterklassen erstellt haben str vor und Verwendung myString is "" könnte dort eine falsche Ausgabe zurückgeben.
Auch das Vergleichen von Zeichenfolgen mit is Im Allgemeinen ist es eine ziemlich böse Falle, da es manchmal richtig funktioniert, aber manchmal nicht, da das String-Pooling ziemlich seltsamen Regeln folgt.
In den meisten Fällen funktionieren jedoch alle genannten Lösungen ordnungsgemäß. Dieser Beitrag ist hauptsächlich akademische Arbeit.
Warum nicht einfach return bool(s.strip())
– anilbey
3. März 20 um 9:23 Uhr
AttributeError: 'NoneType' object has no attribute 'strip'
– Gewölbe
3. März 20 um 13:04 Uhr
s.strip() weist einen neuen String zu, was reine Verschwendung ist. Benutzen string.isspace()
– Clemens
22. Juni 2020 um 15:27 Uhr
"".isspace() ist False
– Danon
17. Juni 21 um 13:57 Uhr
@ Danon wird den ersten Test nicht bestehen s and und wird kurzschließen.
– Alexander Suraphel
18. November 21 um 13:07 Uhr
hostingutilities.com
Leeren oder leeren String testen (kürzerer Weg):
if myString.strip():
print("it's not an empty or blank string")
else:
print("it's an empty or blank string")
Wenn myString = None, wird eine Ausnahme ausgelöst. Verwenden Sie besser die Antwort von @vault
– Dominik
29. Oktober 16 um 12:39 Uhr
@Dominik wenn myString isinstance(myString, int) wird auch eine Ausnahme auslösen. Worum geht es dir? Das OP fragte nach Möglichkeiten zum Testen leerer Zeichenfolgen, seine Frage beinhaltet keine Typprüfung.
– Hammermann6006
17. Dezember 21 um 12:12 Uhr
.
8169400cookie-checkWie überprüfe ich, ob die Zeichenfolge leer ist?yes
Wie ist
""
nicht so gut?– Kein Name
8. Februar 20 um 23:19 Uhr