Как я могу получить доступ к ключу dict при использовании asyncio?

Это простая программа для получения данных свечей с биржи Binance для нескольких пар. Я обнаружил, что это можно сделать с помощью пакета asyncio.

import websockets
import asyncio
import json
import pprint


async def candle_stick_data():
    url = "wss://stream.binance.com:9443/ws/" #steam address
    first_pair = 'xlmbusd@kline_1m' #first pair
    async with websockets.connect(url+first_pair) as sock:
    pairs = '{"method": "SUBSCRIBE", "params": ["xlmbnb@kline_1m","bnbbusd@kline_1m" ],  "id": 1}' #other pairs

    await sock.send(pairs)
    print(f"> {pairs}")
    while True:
        resp = await sock.recv()
        resp=json.loads(resp)
        pprint.pprint(resp)
        candle = resp['k']


asyncio.get_event_loop().run_until_complete(candle_stick_data())

Я получаю сообщения и меняю тип на dict с json.loads(resp). Мой вопрос в том, как я могу получить доступ к значениям dict, потому что candle = resp['k'] вызывает ошибку ключа 'k'. Я новичок в asyncio, возможно, мне он вообще не нужен для получения данных для нескольких пар.

обновленный скриншот сообщения

введите описание изображения здесь


person user15082198    schedule 19.03.2021    source источник
comment
Я получаю сообщения. Какие сообщения?   -  person Tim Roberts    schedule 19.03.2021
comment
Вы распечатываете resp, что очень хорошо. Вы видите на распечатке ключ k?   -  person Tim Roberts    schedule 19.03.2021
comment
@Tim Roberts см. Скриншот   -  person user15082198    schedule 19.03.2021
comment
@ user15082198 Я убрал часть форматирования в вашем посте; пожалуйста, исправьте отступ в кодовом блоке, если я допустил ошибку!   -  person ti7    schedule 19.03.2021
comment
@TimRoberts проверка   -  person user15082198    schedule 19.03.2021
comment
Учитывая этот вывод, ваша ошибка не могла произойти. Здесь вы находитесь в бесконечном цикле, поэтому это происходит снова и снова. Помните, что если пакет большой, sock.recv() не получит его целиком. Возможно, вам следует убедиться, что строка заканчивается на }, прежде чем пытаться ее декодировать.   -  person Tim Roberts    schedule 19.03.2021


Ответы (1)


В вашем первом входящем сообщении действительно нет ключа "k" в словаре.

Я только что добавил в ваш код блок if else, и он работает хорошо:

import websockets
import asyncio
import json
import pprint


async def candle_stick_data():
    url = "wss://stream.binance.com:9443/ws/" #steam address
    first_pair = 'xlmbusd@kline_1m' #first pair
    async with websockets.connect(url+first_pair) as sock:
        pairs = '{"method": "SUBSCRIBE", "params": ["xlmbnb@kline_1m","bnbbusd@kline_1m" ],  "id": 1}' #other pairs

        await sock.send(pairs)
        print(f"> {pairs}")
        while True:
            resp = await sock.recv()
            resp = json.loads(resp)
            # get 'k' key value if it exits, otherwise None
            k_key_val = resp.get('k', None)  
            # easy if else block
            if not k_key_val:
                print(f"No k key found: {resp}")
            else:
                pprint.pprint(k_key_val)

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(candle_stick_data())

person Artiom Kozyrev    schedule 20.03.2021