Python中从Bingx字典获取资产遇类型错误的解决方法
合约/资产获取函数报错排查与解决
正常运行的合约获取代码
instruments = send_request(.......) contractdict = dict() if instruments is not None: for s in instruments['data']: contractdict[s['symbol']] = Contract(s, "bingx")
报错的资产获取代码
margindata = send_request(.......) balancedic = dict() if margindata is not None: for b in margindata['balance']: balancedic[b['asset']] = balance(b, "bingx")
错误信息
TypeError: string indices must be integers, not 'str'
问题根源
这个错误表明你尝试用字符串(如'asset')作为索引访问一个字符串类型的变量,而非预期的字典或列表。结合BingX永续合约账户资产信息API的返回规范(该API返回账户资产数据,结构包含状态码code、提示信息msg,核心数据在data字段下,data内的balance是一个字典数组,每个字典包含asset、balance、availableBalance等字段),问题大概率是:
margindata中没有直接的balance键,balance实际嵌套在data层级下;margindata['balance']返回的是JSON字符串而非解析后的字典数组;- 个别
balance元素不是字典类型。
解决步骤
打印确认返回结构
先输出完整的margindata,明确数据层级和类型:margindata = send_request(.......) print(margindata)根据实际结构修正代码
- 若
balance嵌套在data下(符合API规范的常见情况):margindata = send_request(.......) balancedic = dict() if margindata is not None and 'data' in margindata: # 确保balance是可迭代的列表/数组 balance_list = margindata['data'].get('balance', []) for b in balance_list: # 校验类型和键存在性,避免报错 if isinstance(b, dict) and 'asset' in b: balancedic[b['asset']] = balance(b, "bingx") - 若
margindata['balance']是JSON字符串:import json margindata = send_request(.......) balancedic = dict() if margindata is not None and 'balance' in margindata: try: balance_list = json.loads(margindata['balance']) except json.JSONDecodeError: balance_list = [] for b in balance_list: if isinstance(b, dict) and 'asset' in b: balancedic[b['asset']] = balance(b, "bingx")
- 若
增加类型校验
每次访问字典键前先校验变量类型和键是否存在,能有效避免此类类型错误。
内容的提问来源于stack exchange,提问作者all gm
相关产品推荐
相关产品推荐

