Python: если работает, даже если условие не выполняется - PullRequest
2 голосов
/ 21 июня 2011
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'.Почему? </p>

Ответы [ 3 ]

7 голосов
/ 21 июня 2011

Возможно, вы захотите привести это значение к целому числу согласно:

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:

Подробности реализации CPython: Объекты разных типов, кроме чисел, упорядочены по именам их типов;объекты тех же типов, которые не поддерживают правильное сравнение, упорядочены по их адресу.

Поскольку тип "7" равен str, а тип 10 равен int,он просто сравнивает имена типов ("str" всегда больше, чем "int" в альфа-порядке), что приводит к некоторым интересным вещам, таким как:

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

Эта деталь реализации продолжала действовать, по крайней мере, до2.7.2.Возможно, он изменился в потоке Python 3000 (пункт, безусловно, был удален из соответствующего раздела документации), но в документации там все еще говорится:

Большинство других объектов встроенных-в типах сравниваются неравно, если они не являются одним и тем же объектом;выбор, считать ли один объект меньшим или большим другого, сделан произвольно, но последовательно в течение одного выполнения программы.

Так что, вероятно, вам не следует полагаться на это.

2 голосов
/ 21 июня 2011

Вы сравниваете строку с целым числом:

>>> '10' > 10
True

Это может быть шокирующим; приведена ли строка к целому числу или целое число приведено к строке, в обоих случаях результат должен был быть False. Правда в том, что не происходит ни , а порядок произвольный. Из справочника :

Большинство других объектов встроенных типов сравниваются неравно, если они не являются одним и тем же объектом; выбор, считать ли один объект меньшим или большим другого, делается произвольно, но последовательно в течение одного выполнения программы.

Это решит вашу проблему:

unreadCount = int(re.search(...).group(1))
2 голосов
/ 21 июня 2011

Попробуйте это:

if int(unreadCount) > 10:
    os.system('ls')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...