Python Ninguno si el cheque falla
-
26-10-2019 - |
Pregunta
def myFunc( str ):
print "str=", str
if str == None:
print "str is None"
else:
print "str is not None, value is:", str
Esta función se llama varias veces en mi aplicación sin STR siendo Ninguno. Sin embargo, a veces, aunque STR es ninguno, la prueba falla e imprime:
str=None
str is not None, value is None
¿Cómo puede suceder esto?
Solución
La cuerda 'None'
y el bytestring b'None'
Ambos imprimirán ninguno, pero en realidad no serán ninguno. Además, puede tener clases personalizadas que anulen su __str__
Métodos para devolver 'None'
, aunque en realidad no son ninguno.
Algunas notas estéticas: Python garantiza que solo habrá una instancia de None
, entonces debes usar is
en vez de ==
. Además, no debe nombrar su variable str
, como ese es el nombre de un incorporado.
Prueba esta definición:
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__))
Otros consejos
Verifique el valor de str
otra vez. Si su prueba falla entonces str
no es el especial None
objeto. Presumiblemente Str es, de hecho, la cadena 'None'
.
>>> str = None
>>> str == None
True
>>> str = 'None'
>>> str == None
False
>>> print str
None
A juzgar por sus comentarios, str
es en realidad u'None'
que es una cadena de tipo unicode
. Puedes probar eso como este:
>>> s = unicode('None')
>>> s
u'None'
>>> print s
None
>>> s == 'None'
True
Ahora, aunque podrías hacer eso, sospecho que tu problema se encuentra en otro lugar. El código de llamada debe convertir este objeto en una cadena, por ejemplo con unicode(None)
. Lo más probable es que sea mejor es que el código de llamada solo se convierta en cadena si el objeto no es None
.
Es posible que str
está unido al objeto de cadena "None"
¿por casualidad?
Recomendaría usar if str is None
en vez de ==
. Sin mencionar que realmente no deberías usar str
como un nombre variable.
También podrías usar el __repr__
Método para mostrar el valor:
>>> 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'