Python нет, если проверка не стерла
-
26-10-2019 - |
Вопрос
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'