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
这怎么可能发生?
答案 0 :(得分:5)
字符串'None'
和字节串b'None'
都将打印出None,但实际上不是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__))
答案 1 :(得分:2)
再次检查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
,那么调用代码最好只转换为字符串。
答案 2 :(得分:1)
str
是否有可能以任何机会绑定到字符串对象"None"
?
我建议使用if str is None
代替==
。更不用说,你真的不应该使用str
作为变量名。
答案 3 :(得分:0)
您还可以使用__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'