Python Aucun si la vérification échoue
-
26-10-2019 - |
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?
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'