You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:57:37