Python Нет, если проверка не удалась - PullRequest
1 голос
/ 16 февраля 2012
def myFunc( str ):
      print "str=", str
      if str == None:
        print "str is None"
      else:
        print "str is not None, value is:", str

Эта функция вызывается в моем приложении несколько раз, а str - None. Однако иногда, хотя str равен None, проверка завершается неудачно и выдает:

str=None
str is not None, value is None

Как это может произойти?

Ответы [ 4 ]

5 голосов
/ 16 февраля 2012

Строка 'None' и строка байтов b'None' будут выводить None, но на самом деле не будут равны None. Кроме того, у вас могут быть пользовательские классы, которые переопределяют их __str__ методы для возврата 'None', хотя на самом деле это не None.

Некоторые эстетические замечания: Python гарантирует, что когда-либо будет только один экземпляр None, поэтому вы должны использовать is вместо ==. Кроме того, вы не должны называть вашу переменную str, так как это имя встроенного.

Попробуйте это определение:

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__))
2 голосов
/ 16 февраля 2012

Проверьте значение str еще раз. Если ваш тест не пройден, str не является специальным None объектом. Предположительно str - это строка 'None'.

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

Судя по вашим комментариям, str на самом деле u'None', что является строкой типа unicode. Вы можете проверить это следующим образом:

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

Теперь, хотя вы могли бы это сделать, я подозреваю, что ваша проблема кроется в другом месте. Код вызова должен преобразовывать этот объект в строку, например, с помощью unicode(None). Скорее всего, было бы лучше, если бы вызывающий код преобразовывался только в строку, если объект не None.

1 голос
/ 16 февраля 2012

Возможно ли, что str привязан к строковому объекту "None" случайно?

Я бы рекомендовал использовать if str is None вместо ==. Не говоря уже о том, что вы действительно не должны использовать str в качестве имени переменной.

0 голосов
/ 17 февраля 2012

Вы также можете использовать метод __repr__ для отображения значения:

>>> 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...