如何解决使用 asyncio 时如何访问 dict 键?
这是一个简单的程序,用于从 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())
我收到消息并使用 json.loads(resp)
将类型更改为 dict。我的问题是如何访问 dict 值,因为 candle = resp['k']
会导致“键错误 'k'”。我是 asyncio 的新手,也许我根本不需要它来检索几对的数据。
更新消息截图
解决方法
您的第一条传入消息在字典中确实没有“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())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。