Python:如果即使在不满足条件时也在运行

时间:2011-06-21 07:46:30

标签: python gmail

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'。为什么呢?

3 个答案:

答案 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"的类型为str10的类型为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))
相关问题