Python TypeError: 'float'不可下标访问问题排查与代码修复请求
错误原因排查
- 报错
TypeError: 'float' object is not subscriptable的核心问题:你代码中的balance_info是浮点数类型,而非预期的字典类型。 - 根源出在
get_current_balances函数的返回值:该函数返回的balances字典里,每个币种对应的value是直接的余额数值(float),而非包含free键的字典结构。比如它可能返回{"USDT": 100.5, "BNB": 2.3},而非{"USDT": {"free": 100.5}}。 - 当你用
balances.get(symbol, {"free": 0.0})时,若币种存在则拿到的是浮点数,后续尝试用balance_info['free']访问下标自然会触发报错。
修复方案
两种方案任选其一即可:
方案1:适配函数返回值,修改打印逻辑
如果不想改动get_current_balances函数,直接调整打印代码:
# Get the current balances for the specified symbols symbols_to_check = ["USDT", "BNB", "BTC", "ETH"] balances = get_current_balances(symbols_to_check) print("Current Balances:") for symbol in symbols_to_check: free_balance = balances.get(symbol, 0.0) print(f"{symbol}: Free - {free_balance}")
方案2:修改get_current_balances函数,返回字典格式
如果希望函数返回包含free键的字典结构,调整函数逻辑:
def get_current_balances(symbols): balances = {} # 假设此处为Binance API调用逻辑 for sym in symbols: # 原代码直接赋值浮点数,改为嵌套字典格式 balances[sym] = {"free": float(api_response["free"])} return balances
代码优化建议
- 添加异常处理:调用Binance API时必须捕获网络错误、API权限错误等异常,避免程序直接崩溃:
import requests def get_current_balances(symbols): balances = {sym: {"free": 0.0} for sym in symbols} try: # 替换为你的API请求逻辑 response = requests.get("https://api.binance.com/api/v3/account", headers={"X-MBX-APIKEY": "your_api_key"}) response.raise_for_status() # 触发HTTP错误 account_data = response.json() for asset in account_data["balances"]: if asset["asset"] in symbols: balances[asset["asset"]] = { "free": float(asset["free"]), "locked": float(asset["locked"]) } return balances except requests.exceptions.RequestException as e: print(f"API请求失败: {e}") return balances - 添加类型提示:给函数加类型标注,提升代码可读性:
from typing import Dict, List def get_current_balances(symbols: List[str]) -> Dict[str, Dict[str, float]]: # 函数逻辑 pass - 配置分离:将API密钥、监控币种等参数放到单独的
config.py文件,避免硬编码:
主代码导入使用:# config.py API_KEY = "your_api_key" API_SECRET = "your_api_secret" SYMBOLS_TO_CHECK = ["USDT", "BNB", "BTC", "ETH"]from config import API_KEY, SYMBOLS_TO_CHECK
预测模型改进建议
- 从简单策略入手:作为新手,优先尝试均线交叉(如5日均线金叉20日均线)、RSI超买超卖等经典技术指标策略,逻辑简单易实现,适合快速验证效果。
- 强制回测验证:任何策略上线前必须用历史数据回测,可使用
backtrader或vectorbt库,验证胜率、最大回撤、年化收益等核心指标,避免实盘直接亏损。 - 规范数据预处理:若要构建机器学习模型,先完成数据清洗(填充缺失值、归一化),筛选有效特征(如收盘价、成交量、MACD、布林带等)。
- 严格风险控制:无论用何种模型,必须添加止损止盈逻辑,比如设置单笔交易最大亏损不超过总资金的2%,避免单次交易导致账户大幅亏损。
内容的提问来源于stack exchange,提问作者DepressedUnicorn
相关产品推荐
相关产品推荐

