用Streamlit开发F1聊天Bot遇TypeError: 'NoneType'对象不可下标访问
问题分析与解决
错误根源
ff1.get_session返回None:当输入的年份、赛道名称或赛事类型不符合FastF1的要求时,get_session会返回None。后续访问quali.event时,会因None对象无对应属性触发错误(你看到的'NoneType' object is not subscriptable是连锁报错,本质是quali为None)。- 未做输入校验:用户可能未输入有效内容(比如年份默认值为0、赛道名称为空),直接触发后续逻辑。
st.write参数误用:st.write不支持value、height这类参数,你混淆了它与st.text_area的用法。
修复步骤
1. 增加输入校验
调用ff1.get_session前,确保所有输入有效:
- 年份限制为合理的F1赛事区间(1950至当前年份)
- 赛道名称需为FastF1认可的官方名称(如
'Monaco'、'Silverstone') - 赛事类型必须转换为合法值(
'Q'或'R')且不为空
2. 处理get_session返回None的情况
添加判断逻辑,避免访问None对象的属性。
3. 修正st.write用法
直接传递要显示的内容,无需额外参数。
修复后的代码
import os import nltk import ssl import streamlit as st import random import fastf1 as ff1 import pandas as pd from datetime import datetime st.title("F1bot") st.write("Welcome to the F1bot. Please type a message and press Enter to ask questions related to F1.") counter = 0 counter += 1 st.write('Enter the year') # 限制年份范围,默认设为上一年 current_year = datetime.now().year year = st.number_input("You:", min_value=1950, max_value=current_year, value=current_year-1, key=f"user_input_{counter}") counter += 1 st.write('Enter the venue (e.g., Monaco, Silverstone)') venue = st.text_input("You:", key=f"user_input_{counter}") counter += 1 st.write('Enter the race type whether it is quali or final') rtype = st.text_input("You:", key=f"user_input_{counter}") # 标准化赛事类型,处理空输入 if rtype.strip().lower() == 'quali': rtype = 'Q' elif rtype.strip().lower() == 'final': rtype = 'R' else: rtype = None # 输入校验与逻辑执行 if year and venue and rtype: quali = ff1.get_session(year, venue, rtype) if quali: st.write("Chatbot:") st.write(f"赛事信息:{quali.event.EventName} - {quali.event.Country}") else: st.write("Chatbot: 无法找到对应赛事,请检查输入的年份、赛道名称或赛事类型是否正确。") else: st.write("Chatbot: 请完整输入年份、赛道名称和赛事类型(quali/final)。") st.write("Thank you for chatting with me. Have a great day!")
额外注意事项
- FastF1的赛道名称需严格匹配官方名称,可通过
ff1.get_event_schedule(year)获取对应年份的赛道列表供用户参考。 - 首次运行FastF1可能需要下载赛事数据,确保网络连接正常。
内容的提问来源于stack exchange,提问作者Onkar Mehra
相关产品推荐
相关产品推荐

