如何在 python-telegram-api 的 ConversationHandler 中管理当前状态

Btc*_*ces 2 python python-telegram-bot

我想在我的机器人中使用ConversationHandler。至少,它需要三个参数:

class telegram.ext.ConversationHandler(entry_points, states, fallbacks)
Run Code Online (Sandbox Code Playgroud)

AFAIK,入口点是对话处理程序的触发器,然后每个状态都可以执行自己的处理程序,并且基于回退定义,如果状态中的所有处理程序都返回false,则触发回退。

好的,因此,处理程序会返回一些内容。但处理程序是一个对象,一个类的实例。

基于这个例子,寻找例子来了new_alarm_handler

所以我的疑惑

  1. 处理程序如何返回值?(他们似乎返回了回调函数结果)。

  2. 对话的当前状态在哪里?它似乎无法访问,但却是最后执行的处理程序的最后结果。是吗?如果不是,那么我必须做什么才能改变对话中的当前状态?

  3. 因此,当达到某个状态时,states将执行它们的处理程序列表(作为 arg 传递的字典中的值)。但作为一个列表,它可能不止一个,因此可能有多个返回状态。它是如何管理的?

小智 6

ConversationHandler 将当前state对话存储在一个名为 的字典中conversations,键是一个名为 的实体conversation_key。它是一个元组,由聊天 ID、用户 ID 和消息 ID 组成(其中一些可能会丢失,这是由 和 bool 属性定义per_chatper_userper_message

这里conversations访问get stateincheck_update方法(进一步解释):
https://github.com/python-telegram-bot/python-telegram-bot/blob/2cde878d1e5e0bb552aaf41d5ab5df695ec4addb/telegram/ext/conversationhandler.py#L248
对话的状态不适合手动访问。

当用户向机器人发送消息时,从 TelegramUpdater接收Update对象并将它们传递到其Dispatcher. Dispatcher有一个已注册对象的列表Handler,它们的check_update方法按照添加的顺序调用。check_update要么返回FalseNone要么不应该处理更新,或者返回一些对象,然后将其传递给handle_update方法。

ConversationHandler从自身继承Handler,并且它的字典中有其他Handler对象作为值states。它也已经被check_update覆盖handle_update。它check_update获取当前对话state(请参阅上面的链接)并调用check_update该对话的所有处理程序的方法state。如果它们全部返回,False则对列表中的处理程序执行相同的操作fallbacks。如果他们所有的支票也都返回,False那就什么也不做。

如果处理程序之一应处理该事件,则其check_update返回的对象将传递给ConversationHadlerhandle_update方法。它调用被激发的Handler方法handle_update,该方法又调用在其创建时定义的回调函数。其结果将成为state字典中此对话的新内容conversations

根据 ConversationHandler 文档字符串:

To change the state of conversation, the callback function of a handler must return the new state after responding to the user. If it does not return anything (returning ``None`` by default), the state will not change.