Вопрос

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

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

str=None
str is not None, value is None

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

Это было полезно?

Решение

Струна 'None' и промежуточный b'None' оба не распечатают ни одного, но на самом деле не будут. Кроме того, у вас могут быть пользовательские классы, которые переопределяют их __str__ Методы возвращения '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__))

Другие советы

Проверьте значение 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.

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

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

Вы также можете использовать __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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top