2012-02-16 39 views
1
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,但測試失敗並且它會打印:Python如果檢查失敗,則爲無

str=None 
str is not None, value is None 

這是怎麼發生的?

回答

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__)) 
+2

謝謝,這有幫助。它打印出「str不是無,它是u'None'類型unicode」。這與if檢查工作的其他情況不同:「str不是None,它是NoneType的任何類型」。所以問題是什麼是'不',我該如何檢查。 – Paul 2012-02-16 12:08:09

+1

@Paul不知道你是否已經回答了這個問題,但是對於所有後來進入這個頁面的人來說:'u'None''只是一個值爲'None'的unicode字符串('u'None'= ='None'' - >'True';'u'None'是'None' - >'False')。所以如果你想檢查u'None',你可以檢查:'如果mystr是None或str(mystr)=='None'' – 2012-04-30 17:39:00

1

有沒有可能str綁定到字符串對象"None"

我會推薦使用if str is None而不是==。更何況,你真的不應該使用str作爲變量名稱。

+0

THX。我已經重新命名我的變種。僅strover僅用於stackoverflow示例。 – Paul 2012-02-16 12:02:20

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,調用代碼最好只轉換爲字符串。

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'