Python a-t-il quelque chose comme une variable de chaîne vide où vous pouvez faire:
if myString == string.empty:
Quoi qu'il en soit, quelle est la façon la plus élégante de vérifier les valeurs de chaîne vides? Je trouve que le codage dur à ""
chaque fois pour vérifier une chaîne vide n'est pas aussi bon.
python
string
comparison-operators
Joan Venge
la source
la source
""
pas aussi bon?Réponses:
Les chaînes vides sont "fausses", ce qui signifie qu'elles sont considérées comme fausses dans un contexte booléen, vous pouvez donc simplement faire ceci:
C'est le moyen préféré si vous savez que votre variable est une chaîne. Si votre variable peut également être d'un autre type, vous devez l'utiliser
myString == ""
. Consultez la documentation sur le test de valeur de vérité pour d'autres valeurs fausses dans des contextes booléens.la source
if not myString:
bloc simyString
étaientNone
,0
,False
etc. Donc , si vous n'êtes pas sûr de quel typemyString
est, vous devez utiliserif myString == "":
pour déterminer si elle est une chaîne vide par opposition à une autre valeur falsifiée.if myString == ...
expressions, nous pourrions utiliserif myString in (None, '')
ou selon @Bartek,if myString in (None, '') or not myString.strip()
Depuis PEP 8 , dans la section «Recommandations de programmation» :
Vous devez donc utiliser:
ou:
Juste pour clarifier, les séquences sont évaluées vers
False
ouTrue
dans un contexte booléen si elles sont vides ou non. Ils ne sont pas égaux àFalse
ouTrue
.la source
x == False
. Mais à mon humble avis, la clarification est toujours la bienvenue étant donné le public cible.La façon la plus élégante serait probablement de simplement vérifier si c'est vrai ou faux, par exemple:
Cependant, vous souhaiterez peut-être supprimer les espaces blancs car:
Cependant, vous devriez probablement être un peu plus explicite à ce sujet, sauf si vous savez avec certitude que cette chaîne a passé une sorte de validation et est une chaîne qui peut être testée de cette façon.
la source
Je testerais la nonité avant de me déshabiller. En outre, j'utiliserais le fait que les chaînes vides sont fausses (ou fausses). Cette approche est similaire à StringUtils.isBlank d' Apache ou à Strings.isNullOrEmpty de Guava
Voici ce que j'utiliserais pour tester si une chaîne est soit Aucune OU Vide OU Vide:
Et, exactement le contraire pour tester si une chaîne n'est pas None NOR Empty NOR Blank:
Formes plus concises du code ci-dessus:
la source
if mystring and not mystring.strip()
?string and not string.isspace()
?def isBlank(s): return not (s and s.strip())
etdef isNotBlank(s): return s and s.strip()
.J'ai écrit une fois quelque chose de similaire à la réponse de Bartek et inspiré par javascript:
Tester:
la source
return bool(s.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
La seule façon vraiment solide de procéder est la suivante:
Toutes les autres solutions ont des problèmes possibles et des cas limites où la vérification peut échouer.
len(myString)==0
peut échouer simyString
est un objet d'une classe qui hérite destr
la__len__()
méthode et la remplace .De même
myString == ""
etmyString.__eq__("")
peut échouer en cas demyString
substitution__eq__()
et__ne__()
.Pour une raison quelconque,
"" == myString
il est également dupe en cas demyString
substitution__eq__()
.myString is ""
et"" is myString
sont équivalents. Ils échoueront tous les deux s'ilmyString
ne s'agit pas réellement d'une chaîne mais d'une sous-classe de chaîne (les deux renverrontFalse
). De plus, comme il s'agit de contrôles d'identité, la seule raison pour laquelle ils fonctionnent est que Python utilise le regroupement de chaînes (également appelé internement de chaînes) qui utilise la même instance d'une chaîne si elle est internée (voir ici: Pourquoi comparer des chaînes en utilisant soit '= = 'ou' est 'produit parfois un résultat différent? ). Et""
est interné depuis le début dans CPythonLe gros problème avec le contrôle d'identité est que l'internement de chaînes est (pour autant que je puisse trouver) qu'il n'est pas standardisé quelles chaînes sont internées. Cela signifie, théoriquement,
""
n'est pas nécessaire interné et cela dépend de la mise en œuvre.La seule façon de faire ce qui ne peut vraiment pas être dupé est celui mentionné au début:
"".__eq__(myString)
. Étant donné que cela appelle explicitement la__eq__()
méthode de la chaîne vide, elle ne peut pas être dupe en remplaçant les méthodes dans myString et fonctionne solidement avec les sous-classes destr
.S'appuyer également sur la fausseté d'une chaîne peut ne pas fonctionner si l'objet remplace sa
__bool__()
méthode.Ce n'est pas seulement un travail théorique, mais il pourrait en fait être pertinent dans l'utilisation réelle, car j'ai vu des cadres et des bibliothèques sous-classer
str
avant et utilisermyString is ""
pourrait y retourner une sortie erronée.De plus, comparer des chaînes en utilisant
is
en général est un piège assez mauvais car cela fonctionnera correctement parfois, mais pas à d'autres moments, car le regroupement de chaînes suit des règles assez étranges.Cela dit, dans la plupart des cas, toutes les solutions mentionnées fonctionneront correctement. Ce poste est principalement un travail académique.
la source
Testez une chaîne vide ou vide (méthode plus courte):
la source
myString = None
, cela lèvera une exception. Mieux vaut utiliser la réponse deSi vous voulez faire la différence entre des chaînes vides et nulles, je suggère d'utiliser
if len(string)
, sinon, je suggère d'utiliser simplementif string
comme d'autres l'ont dit. La mise en garde concernant les chaînes pleines d'espaces s'applique toujours, alors n'oubliez passtrip
.la source
if stringname:
donne unfalse
lorsque la chaîne est vide. Je suppose que cela ne peut pas être plus simple que cela.la source
Approche de code propre
Faire ceci:
foo == ""
est une très mauvaise pratique.""
est une valeur magique. Vous ne devriez jamais vérifier les valeurs magiques (plus communément appelées nombres magiques )Ce que vous devez faire, c'est comparer à un nom de variable descriptive.
Noms de variables descriptives
On peut penser que "empty_string" est un nom de variable descriptive. Ça ne l'est pas .
Avant de partir et
empty_string = ""
pensez que vous avez un excellent nom de variable à comparer. Ce n'est pas ce que signifie "nom de variable descriptive".Un bon nom de variable descriptive est basé sur son contexte. Vous devez penser à ce que la chaîne vide est .
Exemple de champ de formulaire simple
Vous créez un formulaire où un utilisateur peut entrer des valeurs. Vous voulez vérifier si l'utilisateur a écrit quelque chose ou non.
Un bon nom de variable peut être
not_filled_in
Cela rend le code très lisible
Exemple d'analyse CSV approfondie
Vous analysez des fichiers CSV et souhaitez que la chaîne vide soit analysée comme
None
(Étant donné que CSV est entièrement basé sur du texte, il ne peut pas représenter
None
sans utiliser de mots clés prédéfinis)Un bon nom de variable peut être
CSV_NONE
Cela rend le code facile à modifier et à adapter si vous avez un nouveau fichier CSV qui représente
None
avec une autre chaîne que""
Il n'y a aucune question quant à savoir si ce morceau de code est correct. Il est assez clair qu'il fait ce qu'il devrait faire.
Comparez cela à
La première question ici est: pourquoi la chaîne vide mérite-t-elle un traitement spécial?
Cela indiquerait aux futurs codeurs qu'une chaîne vide devrait toujours être considérée comme
None
.En effet, il mélange la logique métier (quelle valeur CSV doit être
None
) avec l'implémentation du code (à quoi est-ce que nous comparons réellement)Il doit y avoir une séparation des préoccupations entre les deux.
la source
""
n'est pas une valeur magique, même queTrue
,False
ouNone
ne sont pas des valeurs magiques.la source
a='a'
vous obtiendreza.isspace() -> False
, maisa
ne serait pas pour cette raison une chaîne vide.Que dis-tu de ça? Ce n'est peut-être pas "le plus élégant", mais il semble assez complet et clair:
la source
Répondant à @ 1290. Désolé, aucun moyen de formater les blocs dans les commentaires. La
None
valeur n'est pas une chaîne vide en Python, et ni l'un ni l'autre (espaces). La réponse d'Andrew Clark est le bon:if not myString
. La réponse de @rouble est spécifique à l'application et ne répond pas à la question du PO. Vous aurez des ennuis si vous adoptez une définition particulière de ce qu'est une chaîne "vierge". En particulier, le comportement standard est celui quistr(None)
produit'None'
une chaîne non vide.Cependant, si vous devez traiter
None
and (espaces) comme des chaînes "vides", voici une meilleure façon:Exemples:
Répond aux exigences @rouble sans casser le
bool
comportement attendu des chaînes.la source
python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Je trouve cela élégant car il s'assure qu'il s'agit d'une chaîne et vérifie sa longueur:
la source
-O
indicateur ou définissez laPYTHONOPTIMIZE
variable env.Un autre moyen simple pourrait être de définir une fonction simple:
la source
Cette expression est vraie pour les chaînes vides. Les chaînes non vides, les objets None et non-string produiront tous False, avec la mise en garde que les objets peuvent remplacer __str__ pour contrecarrer cette logique en renvoyant une valeur falsifiée.
la source
Vous pouvez jeter un œil à cette Affectation d'une valeur ou d'une chaîne vide en Python
Il s'agit de comparer des chaînes vides. Donc, au lieu de tester le vide avec
not
, vous pouvez tester si votre chaîne est égale à une chaîne vide avec""
la chaîne vide ...la source
pour ceux qui s'attendent à un comportement comme l'apache StringUtils.isBlank ou Guava Strings.isNullOrEmpty :
la source
Lorsque vous lisez un fichier par lignes et que vous voulez déterminer quelle ligne est vide, assurez-vous que vous l'utiliserez
.strip()
, car il y a un nouveau caractère de ligne dans la ligne "vide":la source
la source
Si vous utilisez simplement
il n'est pas possible de différencier une variable booléenne
False
d'une chaîne vide''
:Cependant, si vous ajoutez une condition simple à votre script, la différence est faite:
la source
Dans le cas où cela serait utile à quelqu'un, voici une fonction rapide que j'ai construite pour remplacer les chaînes vides par des N / A dans des listes de listes (python 2).
Ceci est utile pour publier des listes de listes dans une base de données mysql qui n'accepte pas les blancs pour certains champs (champs marqués comme NN dans le schéma. Dans mon cas, cela était dû à une clé primaire composite).
la source
J'ai fait quelques expériences avec des chaînes comme '', '', '\ n', etc. Je veux que isNotWhitespace soit True si et seulement si la variable foo est une chaîne avec au moins un caractère non blanc. J'utilise Python 3.6. Voici ce que j'ai fini avec:
Enveloppez-le dans une définition de méthode si vous le souhaitez.
la source
Comme prmatta l'a indiqué ci-dessus, mais avec erreur.
la source
""
et" "
et False pour"a"
(comme prévu). Votre code renvoie la même chose, sauf pour la chaîne vide qu'il renvoie True, ce qu'il ne devrait pas.