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
。
处理程序如何返回值?(他们似乎返回了回调函数结果)。
对话的当前状态在哪里?它似乎无法访问,但却是最后执行的处理程序的最后结果。是吗?如果不是,那么我必须做什么才能改变对话中的当前状态?
因此,当达到某个状态时,states
将执行它们的处理程序列表(作为 arg 传递的字典中的值)。但作为一个列表,它可能不止一个,因此可能有多个返回状态。它是如何管理的?
小智 6
ConversationHandler 将当前state
对话存储在一个名为 的字典中conversations
,键是一个名为 的实体conversation_key
。它是一个元组,由聊天 ID、用户 ID 和消息 ID 组成(其中一些可能会丢失,这是由 和 bool 属性定义per_chat
的per_user
)per_message
。
这里conversations
访问get state
incheck_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
要么返回False
,None
要么不应该处理更新,或者返回一些对象,然后将其传递给handle_update
方法。
ConversationHandler
从自身继承Handler
,并且它的字典中有其他Handler
对象作为值states
。它也已经被check_update
覆盖handle_update
。它check_update
获取当前对话state
(请参阅上面的链接)并调用check_update
该对话的所有处理程序的方法state
。如果它们全部返回,False
则对列表中的处理程序执行相同的操作fallbacks
。如果他们所有的支票也都返回,False
那就什么也不做。
如果处理程序之一应处理该事件,则其check_update
返回的对象将传递给ConversationHadler
的handle_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.
归档时间: |
|
查看次数: |
7221 次 |
最近记录: |