使用python-telegram-bot的ConversationHandler时context.user_data取值为None
针对你遇到的context.user_data中存储的fullname、email、notes取值为None,但最后回调的公司数据正常的问题,可能的原因和排查方向如下:
检查状态处理函数的返回值与状态流转
确保每个FSM状态(FULLNAME、EMAIL、NOTES)对应的处理函数,在完成赋值后正确返回了下一个状态。比如:def fullname_handler(update, context): context.user_data['fullname'] = update.message.text # 必须返回下一个状态,否则会话会终止,user_data无法保留到后续步骤 return EMAIL如果返回
ConversationHandler.END或者未正确返回状态,会话会提前结束,后续步骤无法访问之前存储的user_data。核对键名的拼写一致性
检查存储和取值时的键名是否完全一致,比如存的时候用context.user_data['fullname'],取的时候不要写成context.user_data['FullName']或者context.user_data['name'],大小写或拼写错误会导致取不到值。确认CallbackQuery处理函数的上下文正确性
如果最终的CallbackQuery是在会话流程内触发的,确保它属于ConversationHandler的states或fallbacks配置中,这样处理函数才能正确获取当前会话的context。若CallbackQueryHandler独立于ConversationHandler配置,可能无法访问会话内的user_data,这种情况需要把它加入到ConversationHandler的对应状态中。排查是否有代码意外清空user_data
检查所有处理函数中是否存在context.user_data.clear()或者对context.user_data重新赋值的操作(比如context.user_data = {}),这类操作会清空之前存储的数据。验证ConversationHandler的配置
确认ConversationHandler的states字典中正确包含了所有需要的状态,并且每个状态对应的handler配置正确。比如:conv_handler = ConversationHandler( entry_points=[CommandHandler('start', start_handler)], states={ FULLNAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, fullname_handler)], EMAIL: [MessageHandler(filters.TEXT & ~filters.COMMAND, email_handler)], NOTES: [MessageHandler(filters.TEXT & ~filters.COMMAND, notes_handler)], # 确保包含公司选择的回调处理状态 COMPANY: [CallbackQueryHandler(company_handler)] }, fallbacks=[CommandHandler('cancel', cancel_handler)] )若某个状态未被正确加入states,对应的处理函数无法参与会话流转,user_data的存储也不会生效。
内容的提问来源于stack exchange,提问作者Dmitri Supov

