2011-06-21 118 views
2
import imaplib, re 
import os 

while(True): 
    conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
    conn.login("xxx", "xxxx") 
    unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
    print unreadCount 

    if unreadCount > 10: 
     os.system('ls') 

即使unreadCount爲< 10,它也會運行命令'ls'。爲什麼?Python:即使在條件未滿足時也運行

回答

2

試試這個:

if int(unreadCount) > 10: 
    os.system('ls') 
7

您可能需要在該值強制到整數,按:

unreadCount = int (re.search (blah, blah, blah).group (1)) 

re.search調用返回一個字符串,如果你看看下面的成績單:

>>> x = "7" 
>>> if x > 10: 
...  print "yes" 
... 
yes 

>>> if int(x) > 10: 
...  print "yes" 
... 

>>> x = 7 
>>> if x > 10: 
...  print "yes" 
... 
>>> 

你會明白爲什麼這不是一個好主意。

你看到這個(你可以稱之爲怪異)行爲的原因可以從manual5.3底部收集:

CPython的實現細節:除了數字不同類型的對象是按其類型名稱排序;不支持正確比較的相同類型的對象按其地址排序。

由於"7"類型是str10類型爲int,它只是比較類型名稱("str"總是大於"int"以字母順序),導致一些有趣的東西,如:

>>> "1" > 99999999999999999999999 
True 
>>> "1" == 1 
False 

該實現細節仍然有效,直到至少2.7.2。它可能Python的3000流中(該條款肯定已經從相關文檔部分刪除)已經改變,但documentation there還指出:

大多數其他對象的內置類型比較不平等,除非它們是相同的目的;一個對象被認爲是小於還是大於另一個的選擇是任意的,但是在程序的一次執行中是一致的。

所以它可能不是你應該依賴的東西。

2

你比較字符串整數:

>>> '10' > 10 
True 

這可能是令人震驚的;無論該字符串是強制爲一個整數還是整數被強制爲一個字符串,在這兩種情況下結果都應該是False。事實是,既不發生,並且排序是任意的。從language reference

內置類型的大多數其他對象比較不等,除非它們是相同的對象;一個對象被認爲是小於還是大於另一個的選擇是任意的,但是在程序的一次執行中是一致的。

這將解決你的問題:

unreadCount = int(re.search(...).group(1)) 
相關問題