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?

¿Fue útil?

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'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top