Question Le moyen le plus élégant de vérifier si la chaîne est vide en Python?


Est-ce que Python a quelque chose comme une variable de chaîne vide où vous pouvez faire?:

if myString == string.empty:

Quelle que soit la méthode la plus élégante pour vérifier les valeurs de chaînes vides? Je trouve un codage difficile "" chaque fois pour vérifier une chaîne vide n'est pas aussi bon.


925
2018-03-05 20:09


origine


Réponses:


Les chaînes vides sont "fausseté" ce qui signifie qu'ils sont considérés comme faux dans un contexte booléen, donc vous pouvez simplement faire ceci:

if not myString:

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 utiliser myString == "". Voir la documentation sur Test de valeur de vérité pour les autres valeurs qui sont fausses dans les contextes booléens.


1361
2018-03-05 20:10



De PEP 8, dans le Section "Recommandations de programmation":

Pour les séquences, (chaînes, listes, tuples), utilisez le fait que les séquences vides sont fausses.

Donc, vous devriez utiliser:

if not some_string:

ou:

if some_string:

Juste pour clarifier, les séquences sont évalué à False ou True dans un contexte booléen s'ils sont vides ou non. Elles sont inégal à False ou True.


286
2018-03-05 20:12



Le moyen le plus élégant serait probablement de vérifier simplement si c'est vrai ou faux, par exemple:

if not my_string:

Cependant, vous pouvez supprimer l'espace blanc pour les raisons suivantes:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

Vous devriez probablement être un peu plus explicite dans ce cas, 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.


154
2018-03-05 20:11



Je testerais la non-sens avant de me déshabiller. Aussi, j'utiliserais le fait que les chaînes vides soient fausses (ou fausses). Cette approche est similaire à StringUtils.isBlank d'Apache ou Les cordes de goyave.isNullOrEmpty

C'est ce que je voudrais utiliser pour tester si une chaîne est soit OU vide ou vide:

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

Et, exactement le contraire de tester si une chaîne n'est pas Néant NOR Vide Vierge:

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

Des formes plus concises du code ci-dessus:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())

54
2017-07-02 14:44



J'ai déjà écrit quelque chose de similaire à la réponse de Bartek et javascript inspiré:

def isNotEmpty(s):
    return bool(s and s.strip())

Tester:

print isNotEmpty("")    # False
print isNotEmpty("   ") # False
print isNotEmpty("ok")  # True
print isNotEmpty(None)  # False

25
2018-01-16 11:02



Tester une chaîne vide ou vide (plus court):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

11
2018-05-09 07:45



Si vous voulez faire la différence entre les chaînes vides et nuls, je suggère d'utiliser if len(string), sinon, je suggère d'utiliser simplement if string comme d'autres l'ont dit. La mise en garde à propos des chaînes pleines d'espaces s'applique toujours, alors n'oubliez pas de strip.


9
2018-03-05 20:20



a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

6
2017-08-07 15:55



Je trouve hardcoding (sic) "" à chaque fois pour vérifier qu'une chaîne vide n'est pas aussi bonne.

Approche du code propre

Ce faisant: 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 devriez faire est de comparer à un nom de variable descriptif.

Noms de variables descriptives

On peut penser que "empty_string" est un nom de variable descriptif. Ce n'est pas.

Avant de partir et de faire empty_string = "" et pense que vous avez un grand nom de variable à comparer. Ce n'est pas ce que signifie "nom de la variable descriptive".

Un bon nom de variable descriptive est basé sur son contexte. Vous devez penser à ce que la chaîne vide est.

  • D'où est ce que ça vient.
  • Pourquoi est-ce là?
  • Pourquoi avez-vous besoin de vérifier pour cela.

Exemple de champ de formulaire simple

Vous construisez un formulaire dans lequel 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

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

Exemple complet d'analyse syntaxique CSV

Vous analysez les fichiers CSV et souhaitez que la chaîne vide soit analysée None

(Puisque CSV est entièrement basé sur le 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 ""

if csvfield == CSV_NONE:
    csvfield = None

Il n'y a pas de questions sur si ce morceau de code est correct. Il est assez clair qu'il fait ce qu'il devrait faire.

Comparez cela à

if csvfield == EMPTY_STRING:
    csvfield = None

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 doit toujours être considérée comme None.

En effet, il mélange la logique métier (quelle valeur CSV doit être None) avec la mise en œuvre du code (Que comparons-nous réellement à)

Il doit y avoir un séparation des préoccupations entre les deux.


6
2017-10-04 07:35



if my_string is '':

Je n'ai pas remarqué cette combinaison particulière dans l'une des réponses. J'ai cherché

is ''

dans les réponses avant de poster.

 if my_string is '': print ('My string is NULL') # **footnote

Je pense que c'est ce que l'affiche originale essayait d'obtenir ... quelque chose qui se lit aussi proche de l'anglais que possible et suit des pratiques de programmation solides.

if my_string is '':
    print('My string is NULL')
else:
    print(f'My string is {my_string}')

Personnage pour personnage Je pense que cette solution est bonne.

J'ai noté None est entré dans la discussion, ajoutant ainsi que nous obtenons:

if my_string is '': print('My string is NULL')
elif my_string is None : print('My string.... isn\'t')
else: print(f'My string is {my_string}')

NOTE DE BAS DE PAGE: Comment "mauvais" serait-il pour un PEP d'ajouter un nouveau mot-clé Null? Null == ''   Avant que cela se produise, on pourrait se faufiler dans une importation standard Null = '' de sorte que l'on peut avoir les contrôles de chaîne les plus anglais comme .. hmmmm ....

if my_string is not Null:
    print(f'my_string is not Null and is {my_string}')

6
2017-11-22 22:26



if stringname: donne un false quand la chaîne est vide Je suppose que ça ne peut pas être plus simple que ça.


4
2018-03-05 20:15