Как проверить, плохой ли статус подписки в подписке Bloomberg Python API?

Я пишу программу для проверки потока данных Bloomberg с использованием метода подписки Python API. Я близок к завершению, и теперь я пытаюсь покрыть крайние случаи, такие как неудачная подписка. Я хочу проверить, не прошла ли подписка. Если не удастся, я запишу его в файл с именем BadSubscription.txt.

Одна из программ-примеров, которые поставляются с пакетом Bloomberg API, SimpleSubcriptionExample.py, имеет всего одну строку кода для статуса подписки, поэтому она не дает мне четкого представления.

try:
    # Process received events
    eventCount = 0
    while(True):
       # We provide timeout to give the chance to Ctrl+C handling:
       event = session.nextEvent(15000)
       for msg in event:
           if event.eventType() == blpapi.Event.SUBSCRIPTION_STATUS or \
                   event.eventType() == blpapi.Event.SUBSCRIPTION_DATA:
               print("%s - %s" % (msg.correlationIds()[0].value(), msg))
           else:
               print(msg)

Приведенный выше код печатает следующее, когда подписка не подходит для подписки на несуществующую ценную бумагу / капитал:

SubscriptionFailure = {
    reason = {
        errorCode = 2
        description = "Invalid security, rcode = -11"
        category = "BAD_SEC"
        source = " [nid:3924]:bbdbm10"
    }
}

И когда подписка успешна, он печатает:

SubscriptionStarted = {
    exceptions[] = {
    }
    streamIds[] = {
        "1"
    }
    receivedFrom = {
        address = "localhost:8194"
    }
    reason = "Subscriber made a subscription"
}

Я хочу написать оператор if для моей программы, чтобы поймать SubscriptionFailure и записать сообщение в файл:

for msg in event:
    if (event.eventType() == blpapi.Event.SUBSCRIPTION_STATUS 
           and (**the condition to catch the error**)):
        f = open("BadSubscription.txt", "a+")
        f.write(msg)

Я ищу условие для использования в моем операторе if.

Я пробовал читать следующий репозиторий, но он тоже мало что объясняет. https://bloomberg.github.io/blpapi-docs/python/3.13/_autosummary/blpapi.Session.html?highlight=subscription%20status


person Cagri    schedule 24.11.2020    source источник
comment
Я не знаю об API Python, но подозреваю, что вы сможете вызвать msg.msgType() и проверить это на SubscriptionStarted. Если это не то же самое, значит, у вас ошибка.   -  person assylias    schedule 24.11.2020
comment
Спасибо @assylias. Я понял это с вашей помощью. Я разместил свой ответ ниже.   -  person Cagri    schedule 25.11.2020


Ответы (1)


Я сначала попробовал

msg.correlationIds()[0].value().find("SubscriptionFailure")!=-1

как условие, но это не сработало.

Благодаря @assylias я нашел решение.

for msg in event:
    if (event.eventType() == blpapi.Event.SUBSCRIPTION_STATUS 
            and msg.messageType() == "SubscriptionFailure"):
        f = open("BadSubscription.txt", "a+")
                    s = ""
                    if msg.getElement("reason").getElement("errorCode").getValueAsInteger() !=12:
                        s = msg.toString()
                    f.write(s)

Приведенный выше код записывает в мой файл следующее:

SubscriptionFailure = {
    reason = {
        errorCode = 2
        description = "Invalid security, rcode = -11"
        category = "BAD_SEC"
        source = " [nid:235]:bbdbm10"
    }
}
person Cagri    schedule 24.11.2020
comment
Вместо этого вы можете использовать and msg.messageType() != "SubscriptionStarted"):, поскольку могут быть другие коды ошибок. - person assylias; 25.11.2020
comment
В этом есть больше смысла, но с этим есть небольшая проблема. Типы сообщений не ограничиваются двумя (неудача или успех), и я не знаю, все ли остальные являются ошибками, которые нужно покрыть. Например, при каждой успешной подписке сообщение SubscriptionStreamsActivated печатается вместе с SubscriptionStarted. К сожалению, репозиторий Bloomberg на github не предоставляет информацию обо всех типах сообщений. Я все равно постараюсь осветить другие возможные исходы - person Cagri; 25.11.2020