Питонический способ проверки и опроса механизма - PullRequest
2 голосов
/ 16 марта 2012

Как питонный способ проверки наличия в строке нескольких подстрок?

Например, Я делаю опрос и проверяю статус загрузки через API. API возвращает статус «Загрузка завершена», «x% загружен» или «Установка».

Теперь я хочу проверить, присутствуют ли строки «загружен» и «установка» в статусе, возвращенном API, и если нет, вызвать исключение. Я реализовал это очень новичком.

if api_object.status == 'Download Complete'  :
        break

elif 'Downloaded' in api_object.status.split():
        time.sleep(interval)

elif 'Downloaded' not in api_object.status.split() or \
'Installing' not in api_object.status.split():
        raise Exception("Error")

Хотелось бы узнать какие-нибудь лучшие подходы для сравнения.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 16 марта 2012

Немного более компактная версия:

if api_object.status == 'Download Complete':
    break
elif 'Downloaded' in api_object.status:
    time.sleep(interval)
elif 'Installing' not in api_object.status:
    raise Exception("Error")
0 голосов
/ 16 марта 2012

Вот мой код:

if 'Download Complete'  == api_object.status:
    break       
if 'Installing' == api_object.status:
    continue
if api_object.status and api_object.status.endswith('Downloaded'):
    time.sleep(interval)
else:
    raise Exception("Error")
0 голосов
/ 16 марта 2012

Как насчет:

status = api_object.status.partition(" ");
try:
    action = {
        "Downloaded": doA
        "Complete": doB
        "Installing": doC
    }[status[2] or status[0]]
except KeyError:
    # unknown status
    raise
action();

Использование dict - распространенная идиома в python для замены отсутствующего оператора switch.От doA до doC должны быть вызовы, которые вы вызываете в последней строке.Используя метод partition (sep) и оператор or, можно легко выбрать правильную часть строки: если она существует, она получает часть за пробелом, иначе - всю строку.

Следует отметить, однако, что кэширование словаря может быть полезно в приложении, критичном к производительности, для безопасного времени для хеширования ключей и построения разборов.1011 * lower () в строке состояния (перед разделом) и поместите ключи в нижний регистр.

В этом конкретном случае требуется break.Это можно сделать, разрешив вызываемой функции возвращать логическое значение, которое, если True, вызывает break или аналогичный подход.

0 голосов
/ 16 марта 2012

Я не знаю, является ли ваш код "питоническим" или нет, но его легко понять, и это главное, даже если он немного длиннееПроверьте следующий «более питонический» способ:

....
elif all([(x not in status) for x in ['Downloaded', 'Installing'] ]):
....

это читается лучше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...