CS50 Finance项目check50报错:TypeError: 'NoneType'对象不可下标
问题定位与修复方案
1. 核心错误:Buy功能错误存储股票代码
在buy函数中,你将lookup返回的股票名称(name)存入了数据库的symbol字段,而非正确的股票代码(symbol):
# 错误代码 symbol = lookup(request.form.get("symbol"))["name"]
后续index函数用这个名称调用lookup(symbol)时,lookup无法识别股票名称,返回None,执行price = lookup(symbol)["price"]就会触发TypeError: 'NoneType' object is not subscriptable。
修复:
先获取完整的lookup结果,再提取正确的股票代码:
# 替换buy函数中的相关代码 stock_data = lookup(request.form.get("symbol")) if stock_data is None: return apology("Please enter valid quotes") price = stock_data["price"] symbol = stock_data["symbol"] # 存储股票代码而非名称
2. Sell功能中脆弱的Symbol切片处理
在sell函数中,你通过硬编码切片提取symbol:
symbol = symbol[12:][:-2]
这种方式依赖前端下拉选项的格式,check50的测试用例格式可能和你本地不同,导致处理后的symbol无效,lookup返回None触发错误。
修复:
修改sell页面的HTML,将下拉选项的value设为股票代码:
<select name="symbol"> {% for quote in quotes %} <option value="{{ quote.symbol }}">{{ quote.symbol }}</option> {% endfor %} </select>
然后在sell函数中直接获取正确的symbol:
# 删除symbol切片代码,直接获取 symbol = request.form.get("symbol")
3. Index函数中增加None判断
即使修复了上述问题,仍可能存在lookup返回None的情况(比如股票代码失效),需要增加判断避免报错:
# 在index函数的循环中 symbol = user_info[i]["symbol"] stock_data = lookup(symbol) if stock_data is None: continue # 跳过无效股票或返回提示 price = stock_data["price"]
4. 其他稳定性优化
- 在
quote函数中避免重复调用lookup:# 替换原代码 stock_data = lookup(request.form.get("symbol")) if stock_data is None: return apology("You need to enter correct Symbol") symbol_name = stock_data["name"] value = stock_data["price"] return render_template("quoted.html", symbol=symbol_name, value=value) - 所有数据库查询后,先判断结果是否为空再访问下标:
cash_result = db.execute("SELECT cash FROM users WHERE id == ?", user_id) if not cash_result: return apology("User not found") cash = cash_result[0]["cash"]
内容的提问来源于stack exchange,提问作者Shon
相关产品推荐
相关产品推荐

