- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试研究 python 库 Telepot
通过查看 counter.py
此处提供的示例:https://github.com/nickoala/telepot/blob/master/examples/chat/counter.py .
我发现有点难以理解 DelegatorBot
类实际上有效。
这是我认为到目前为止我已经理解的内容:
1.
我看到最初正在定义这个类(派生自“ChatHandler”类):
class MessageCounter(telepot.helper.ChatHandler):
def __init__(self, *args, **kwargs):
super(MessageCounter, self).__init__(*args, **kwargs)
self._count = 0
def on_chat_message(self, msg):
self._count += 1
self.sender.sendMessage(self._count)
DelegatorBot
创建一个机器人:
bot = telepot.DelegatorBot(TOKEN, [
pave_event_space()(
per_chat_id(), create_open, MessageCounter, timeout=10
),
])
DelegatorBot
的新实例创建并放入变量
bot
.第一个参数是电报验证此机器人所需的 token ,第二个参数是一个列表,其中包含我不理解的内容。
pave_event_space()(
per_chat_id(), create_open, MessageCounter, timeout=10
)
pave_event_space()
一个被调用的方法返回对另一个方法的引用?然后使用参数
(per_chat_id(), create_open, MessageCounter, timeout=10)
调用返回的方法?
最佳答案
简答
是的,pave_event_space()
返回一个函数。让我们称之为 fn
. fn
然后用 fn(per_chat_id(), create_open, ...)
调用,它返回一个二元组 (seeder function, delegate-producing function)
.
如果你想进一步研究代码,这个简短的回答可能不是很有帮助......
更长的答案
了解什么pave_event_space()
做了什么以及这一系列的论点意味着什么,我们必须回到基础并理解 DelegatorBot
接受作为参数。DelegatorBot
的构造函数是 explained here .简单地说,它接受一个 2 元组列表 (seeder function, delegate-producing function)
.为了减少冗长,我将调用第一个元素 播种机和第二个元素 委托(delegate)制作人 .
播种机有此签名 seeder(msg) -> number
.对于收到的每条消息,seeder(msg)
被调用以生成 number
.如果那 number
是新的,同伴委托(delegate)生产者(与播种者共享同一元组的那个)将被调用以生成一个线程,该线程用于处理新消息。如果那 number
已经被一个正在运行的线程占用了,什么都不做。本质上,播种者对消息进行“分类”。如果它看到一条消息属于一个新的“类别”,它就会产生一个新线程。
委托(delegate)制作人有这个签名 producer(cls, *args, **kwargs) -> Thread
.它调用 cls(*args, **kwargs)
实例化处理程序对象(在您的情况下为 MessageCounter
)并将其包装在线程中,因此处理程序的方法是独立执行的。
(注意:实际上,播种者不一定返回 number
并且委托(delegate)生产者不一定返回 Thread
。为了清楚起见,我在上面进行了简化。See the reference 以获得完整的解释。)
在 Telepot 的早期,一个 DelegatorBot
通常是通过透明地提供播种机和委托(delegate)生产者来制作的:
bot = DelegatorBot(TOKEN, [
(per_chat_id(), create_open(MessageCounter, ...))])
ChatHandler
)添加了生成自己的事件(例如超时事件)的功能。每类处理程序都有自己的事件空间,因此不同类的事件不会混合。在每个事件空间中,事件对象本身也有一个源 id 来标识哪个处理程序发出了它。这种架构对播种者和委托(delegate)生产者提出了一些额外的要求。
number
这导致了事件发射器(因为我们不想为这个事件产生一个线程;它应该由事件发射器本身处理)。委托(delegate)生产者还必须将适当的事件空间传递给 Handler 类(因为每个 Handler 类都有一个唯一的事件空间,由外部生成)。
(seeder, delegate-producer)
必须获得全局独一无二的事件空间。
pave_event_space()
确保这两个条件,基本上将一些额外的操作和参数修补到
per_chat_id()
上。和
create_open()
并确保它们是一致的。
pave_event_space()(...)
而不是更直接的
pave_event_space(...)
?
(per_chat_id(), create_open(MessageCounter, ...))
. “修补”通常意味着 (1) 将一些额外的操作附加到
per_chat_id()
,以及 (2) 在调用中插入一些额外的参数
create_open(... more arguments here ...)
.这意味着我不能让用户拨打
create_open(...)
直接因为,一旦被调用,我就不能插入额外的参数。我需要一个更抽象的构造,其中用户指定
create_open
但电话
create_open(...)
其实是我做的。
pair
的函数,其签名为
pair(per_chat_id(), create_open, ...) -> (per_chat_id(), create_open(...))
.换句话说,它将第一个参数作为第一个元组元素传递,并通过实际调用
create_open(...)
创建第二个元组元素。与剩余的论点。
pave_event_space
的伪代码看起来像这样:
def pave_event_space(fn=pair):
def p(s, d, *args, **kwargs):
return fn(append_event_space_seeder(s),
d, *args, event_space=event_space, **kwargs)
return p
pair
,并返回
pair
-like 函数(签名与
pair
相同),但具有更复杂的播种器和更多参数标记。这就是我所说的“修补”的意思。
pave_event_space
是最常见的“修补程序”。其他修补程序包括
include_callback_query_chat_id
和
intercept_callback_query_origin
.他们都做基本相同的事情:需要一个
pair
-like 函数,返回另一个
pair
-like 函数,带有更复杂的播种机和更多参数标记。因为输入和输出是相似的,所以可以将它们链接起来以应用多个补丁。如果您查看
callback examples ,你会看到这样的:
bot = DelegatorBot(TOKEN, [
include_callback_query_chat_id(
pave_event_space())(
per_chat_id(), create_open, Lover, timeout=10),
])
per_chat_id()
)和处理程序(
Lover
)能够协同工作。
关于python - DelegatorBot 在 TelePot 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45387797/
我为 telegram 组创建了一个机器人,但是每当有人发送一个poll 时,这个错误就会一次又一次地出现。 不断给出错误的 API 消息: {"update_id":869921319, "poll
我在 python 3.5 中将 Telepot python 库与我的机器人一起使用。我想阅读已经在聊天中的消息文本,知道电报聊天的 id 和消息的 id。我能怎么做? 最佳答案 telepot库是
我可以使用 Telepot 将内联键盘按钮放在多行上吗? 如果我能做到,我该怎么做? 我尝试通过这个示例来学习如何使用 InlineKeyboard, 但我没有找到有关 Telepot 中内联键盘的其
我是 Python 和 Telegram bot 的新手,我希望你能通过一个简单的例子帮助我理解这一点。我需要的是定义一个方法,返回一个字符串来完成一个 url。在Python中我需要的是: user
我已经尝试过了 elif command == 'bold': telegram_bot.sendMessage (chat_id, str("*bold*"), reply_markup=m
我无法发送照片,这里的代码有错误: if command.startswith('/rank '): rank(msg) def rank(msg): chat_id = msg['c
我正在尝试研究 python 库 Telepot通过查看 counter.py此处提供的示例:https://github.com/nickoala/telepot/blob/master/examp
我正在使用 telepot 制作电报机器人。 当群聊消息以“/”开头时,它会处理一个处理程序。 有没有办法获取所有群聊消息? 最佳答案 有两种方法可以获取一个群组的所有消息: 1.您的机器人应该被添加
我正在使用 Python 的 Telepot 库开发 Telegram Bot ,并且需要让两个机器人在一组中相互通信。 出于某种原因,两个机器人都无法读取机器人发送的消息。 有人能告诉我我该怎么做吗
我试图制作一个机器人来检索群组中聊天发件人的姓名。我将 Python 与 Telepot 结合使用。 >>> from pprint import pprint >>> import telepot
在我的研究中,我想使用 Telegram 机器人每天在特定时刻向实验中 35 名志愿者的个人智能手机发出 4 个简单的多项选择题。我已经检查了 Telepot 文档和示例,但我无法构建一个好的解决方案
我目前正在使用 VPN 和用于管理 Telegram Bot 的 telepot 库。 当我尝试收听消息时,它给了我这个 SSL 错误。 Traceback (most recent call las
我正在使用 python 编写电报机器人 telepot api .我现在被困在我想发送直接来自 URL 而不将其存储在本地的图片的点。 Telepot提供以下发送照片的说明: >>> f = ope
我是一名优秀的程序员,十分优秀!