2011-06-21 55 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)) 
相关问题