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'。为什么呢?
答案 0 :(得分: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"
...
>>>
你会明白为什么这不是一个好主意。
您可能会从5.3
底部的manual收集到您(可能称之为奇怪的)行为的原因:
CPython实现细节:除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
由于"7"
的类型为str
且10
的类型为int
,因此只需比较类型名称("str"
始终大于{alpha命令中的"int"
),导致一些有趣的事情,如:
>>> "1" > 99999999999999999999999
True
>>> "1" == 1
False
该实施细节至少持续到2.7.2。它可能在Python 3000流中发生了变化(该子句肯定已从相关文档部分中删除),但documentation there仍然指出:
内置类型的大多数其他对象比较不相等,除非它们是同一个对象;一个对象被认为是小于还是大于另一个对象的选择是在程序的一次执行中任意但一致的。
所以这可能不是你应该依赖的东西。
答案 1 :(得分:2)
试试这个:
if int(unreadCount) > 10:
os.system('ls')
答案 2 :(得分:2)
您正在将字符串与整数进行比较:
>>> '10' > 10
True
这可能令人震惊;是否将字符串强制转换为整数或将整数强制转换为字符串,在这两种情况下结果都应为False
。事实是,既不会发生,而且排序是任意的。来自language reference:
内置类型的大多数其他对象比较不相等,除非它们是同一个对象;一个对象被认为是小于还是大于另一个对象的选择是在程序的一次执行中任意但一致的。
这将解决您的问题:
unreadCount = int(re.search(...).group(1))