web-dev-qa-db-fra.com

Meilleure façon de faire un test "non-néant" en Python pour une chaîne vide normale et Unicode?

En Python 2.7, j'écris une classe qui appelle une fonction dans une API qui peut ou non renvoyer une chaîne vide. De plus, la chaîne vide peut être unicode u"" ou non-unicode "". Je me demandais quel était le meilleur moyen de vérifier cela?

Le code suivant fonctionne très bien pour une chaîne vide, mais pas pour une chaîne unicode vide:

class FooClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for normal empty strings, not unicode:
    if string is not None:
        print "string is not an empty string."

Au lieu de cela, je devrais l'écrire comme ceci pour que cela fonctionne pour Unicode:

class BarClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for unicode empty strings, not normal:
    if string is not u"":
        print "string is not an empty string."

... et comme ceci pour le faire fonctionner pour les deux chaînes vides non unicode et unicode:

class FooBarClass():
    string = ...
    string = might_return_normal_empty_string_or_unicode_empty_string(string)

    # Works for both normal and unicode empty strings:
    if string is not u"" or None:
        print "string is not an empty string."

La troisième méthode est-elle le meilleur moyen de le faire ou existe-t-il un meilleur moyen? Je demande parce qu'écrire un u"" me semble un peu trop codé en dur. Mais si c'est la meilleure façon de le faire, ainsi soit-il. :) Merci pour toute aide que vous pouvez offrir.

19
Dave Gallagher

Les chaînes vides sont considérées comme fausses.

if string:
    # String is not empty.
else:
    # String is empty.
44
Artur Gaspar

Je dois contester votre première déclaration;

# Works for normal empty strings     <-- WRONG
if string is not None:
    print "string is not an empty string."

Dans Python 2.7.1, "" is not None correspond à True - so string="" donne donc string is not an empty string (ce qui est certainement le cas!).

Pourquoi y apporter None?

s = random_test_string()
s = API_call(s)

if len(s):
    # string is not empty
    pass
5
Hugh Bothwell

Vous jamais souhaitez utiliser is avec tout ce qui n'est pas garanti d'être un singleton. Vérifiez la longueur de la valeur renvoyée et s'il s'agit d'une instance de unicode.

4

None est certainement une bonne chose à inclure dans la conversation, surtout si vous écrivez une classe qui peut être utilisée par d'autres programmeurs. 

None est une valeur valide, et totalement unique , qu'une chaîne peut avoir.

Je suis new to Python, donc je ne suis pas encore complètement familiarisé avec l'utilisation de ' correct ' de None. My son utilisation la plus fréquente est l’initialisation de chaînes et de listes. Si mon code rencontre un cas dans lequel j'essaie de faire quelque chose avec une chaîne ou une liste que mon code n'a pas définie spécifiquement sur une valeur, je veux le savoir. Je l'utilise comme un filet de sécurité de toutes sortes.

if my_string is '': print('My string is NULL')
Elif my_string is None : print('My string.... isn\'t')
else: print('My string is ' + my_string)
0
MikeyB

Vérifiez quoi ?

if s is None:
    print "s is None"
else:
    if isinstance(s, unicode):
        print "s is unicode, %r" % s
    else:
        print "s is bytes, %r" % s

    if s:
        print "s is not empty"
    else:
        print "s is empty"

Il suffit de vérifier d'abord None, comme d'habitude.

0
Jochen Ritzel