【问题标题】:Python: If is running even when condition is not metPython:即使条件不满足,如果仍在运行
【发布时间】:2011-06-21 07:46:29
【问题描述】:
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 gmail


    【解决方案1】:

    您可能希望将该值强制转换为 整数, 如下:

    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" 总是大于"int" 的字母顺序),领先一些有趣的事情,例如:

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

    该实施细节至少在 2.7.2 之前仍然有效。它可能在 Python 3000 流中发生了变化(该子句肯定已从相关文档部分中删除),但 documentation there 仍然声明:

    大多数其他内置类型的对象比较不相等,除非它们是同一个对象;一个对象被认为比另一个对象更小还是更大的选择是任意的,但在程序的一次执行中始终如一。

    所以它可能不是你应该依赖的东西。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

        【解决方案3】:

        您正在将字符串与整数进行比较:

        >>> '10' > 10
        True
        

        这可能令人震惊;无论是字符串被强制转换为整数还是整数被强制转换为字符串,在这两种情况下,结果都应该是False。事实是,都没有发生,而且顺序是任意的。来自language reference

        大多数其他内置类型的对象比较不相等,除非它们是同一个对象;一个对象被认为比另一个对象更小还是更大的选择是任意的,但在程序的一次执行中始终如一。

        这将解决您的问题:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-02
          • 1970-01-01
          • 2018-01-16
          • 1970-01-01
          • 1970-01-01
          • 2018-02-20
          • 2021-08-07
          • 2019-06-10
          相关资源
          最近更新 更多