Question

def myFunc( str ):
      print "str=", str
      if str == None:
        print "str is None"
      else:
        print "str is not None, value is:", str

Cette fonction est appelée plusieurs fois dans mon application avec aucun str être. Cependant, parfois, bien que str est None, le test échoue et il imprime:

str=None
str is not None, value is None

Comment cela peut-il arriver?

Était-ce utile?

La solution

La 'None' chaîne et la b'None' bytestring sera à la fois imprimer Aucun, mais pas réellement rien. En outre, vous pouvez avoir des classes personnalisées qui remplacent leurs méthodes de __str__ à 'None' de retour, mais ils sont en fait pas None.

Quelques notes esthétiques: Python garantit qu'il ne va jamais une instance de None, vous devez donc utiliser is au lieu de ==. En outre, vous ne devriez pas le nom de votre str variable, comme c'est le nom d'un. Intégré

Essayer cette définition:

def myFunc(s):
    if s is None:
        print('str is None')
    else:
        print('str is not None, it is %r of type %s' % (s, type(s).__name__))

Autres conseils

Vérifiez à nouveau la valeur de str. Si votre test échoue alors str n'est pas l'objet None spécial. est sans doute str en fait la chaîne 'None'.

>>> str = None
>>> str == None
True
>>> str = 'None'
>>> str == None
False
>>> print str
None

A en juger par vos commentaires, str est en fait u'None' qui est une chaîne de type unicode. Vous pouvez tester pour cela comme ceci:

>>> s = unicode('None')
>>> s
u'None'
>>> print s
None
>>> s == 'None'
True

Maintenant, alors que vous pouvez le faire, je pense que votre problème est ailleurs. Le code d'appel doit être convertir cet objet à une chaîne, par exemple avec unicode(None). Il serait plus mieux est probablement le code d'appel uniquement converti en chaîne si l'objet n'est pas None.

Est-il possible que str est lié à l'objet chaîne "None" par hasard?

Je recommande d'utiliser if str is None au lieu de ==. Sans parler, vous ne devriez pas utiliser str comme nom de variable.

Vous pouvez également utiliser la méthode __repr__ pour montrer la valeur:

>>> x = None
>>> print 'the value of x is', x.__repr__()
the value of x is None
>>> x = "None"
>>> print 'the value of x is', x.__repr__()
the value of x is 'None'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top