PTB父子ConversationHandler优先级问题:如何让子状态优先处理更新?
Python Telegram Bot嵌套ConversationHandler优先级问题
在使用Python Telegram Bot(PTB)的父子嵌套ConversationHandler时,遇到了状态优先级问题:子状态无法优先处理更新,父状态的处理器会先被触发。
单嵌套场景代码
... child_conv_handler = ConversationHandler( entry_points=[CommandHandler("start_child", start_child_func)], states={ CHILD_STATE: [ CommandHandler("search", search), CommandHandler("add", add), CommandHandler("exit", exit), ], }, fallbacks=[MessageHandler(filters.TEXT, fallback_message),], ) parent_conv_handler = ConversationHandler( entry_points=[CommandHandler("start_parent", start_parent_func)], states={ PARENT_STATE: [ CommandHandler("stats", stats), child_conv_handler, ], }, fallbacks=[CommandHandler("stop", stop)], ) application.add_handler(parent_conv_handler) application.run_polling(allowed_updates=Update.ALL_TYPES)
操作流程与问题表现
- 发送
/start_parent启动父ConversationHandler; start_parent_func回调返回对话状态PARENT_STATE;- 发送
/start_child启动子ConversationHandler; start_child_func回调返回对话状态CHILD_STATE;- 发送
/stats命令时,触发的是父级PARENT_STATE下的CommandHandler("stats", stats),而非子状态的对应处理器。
此时机器人同时处于PARENT_STATE和CHILD_STATE,但父状态优先级更高。单个子Handler的情况可以通过调整处理器顺序解决,但多子Handler场景下这个方法不适用:
多子嵌套场景代码
... child_conv_handler1 = ConversationHandler( entry_points=[CommandHandler("start_child1", start_child_func1)], states={ CHILD_STATE1: [ CommandHandler("stats", child_stats1), ], }, fallbacks=[MessageHandler(filters.TEXT, fallback_message),], ) child_conv_handler2 = ConversationHandler( entry_points=[CommandHandler("start_child2", start_child_func2)], states={ CHILD_STATE2: [ CommandHandler("stats", child_stats2), ], }, fallbacks=[MessageHandler(filters.TEXT, fallback_message),], ) parent_conv_handler = ConversationHandler( entry_points=[CommandHandler("start_parent", start_parent_func)], states={ PARENT_STATE: [ CommandHandler("stats", parent_stats), child_conv_handler1, child_conv_handler2 ], }, fallbacks=[CommandHandler("stop", stop)], ) application.add_handler(parent_conv_handler) application.run_polling(allowed_updates=Update.ALL_TYPES)
需求
如何让子状态成为主状态,或者在启动子Handler时将父Handler置于“停滞状态”?
内容的提问来源于stack exchange,提问作者EKong
相关产品推荐
相关产品推荐

