异步CCXT应用报错TypeError: dict_keys无法用于await表达式求解决
解决CCXT异步代码中
dict_keys can't be used in 'await' expression错误 问题背景
基于CCXT异步示例开发应用时,运行代码触发以下错误:
TypeError object dict_keys can't be used in 'await' expression
原核心代码片段(init.py):
import ccxt.async_support as ccxt class Init: async def loadSymbols(self): symbols_list = {} for exchange_id in ['poloniex', 'binance']: exchange_class = getattr(ccxt, exchange_id) exchange = exchange_class() try: await exchange.load_markets() # 错误根源:给普通dict_keys对象加了await symbols_list[exchange_id] = await exchange.markets.keys() except Exception as e: print(type(e).__name__, str(e)) await exchange.close() return symbols_list
错误原因
await关键字仅能用于协程、Future或其他可await对象,而exchange.markets是调用await exchange.load_markets()后得到的普通Python字典,exchange.markets.keys()返回的是dict_keys类型的可迭代对象,完全不需要用await修饰。
正确修改方案
直接去掉多余的await,如果需要将符号集合转为普通列表(方便后续操作),可以用list()包裹:
修改后的init.py代码:
import ccxt.async_support as ccxt class Init: async def loadSymbols(self): symbols_list = {} for exchange_id in ['poloniex', 'binance']: exchange_class = getattr(ccxt, exchange_id) exchange = exchange_class() try: await exchange.load_markets() # 去掉await,可选转为列表 symbols_list[exchange_id] = list(exchange.markets.keys()) except Exception as e: print(type(e).__name__, str(e)) await exchange.close() return symbols_list
为什么之前的尝试无效
- 尝试一:使用
asyncio.gather(*input_coroutines)是错误的,因为exchange.markets.keys()返回的不是协程集合,gather要求传入可await对象,因此触发An asyncio.Future, a coroutine or an awaitable is required错误。 - 尝试二:取
list(exchange.markets.keys())[0]仅能获取单个符号,完全偏离了获取所有符号的需求,且错误配合asyncio.gather使用,逻辑不成立。
内容的提问来源于stack exchange,提问作者stas stas
相关产品推荐
相关产品推荐

