Python如果检查失败,则无

时间:2012-02-16 11:54:57

标签: python-2.7

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 个答案:

答案 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'