Python Telegram bot 从列表中添加处理程序

舔过

我在运行时添加命令处理程序时遇到问题,这是一个示例:

from telegram.ext import Updater, CommandHandler

updater = Updater(token)
items = [
    ('a', 1),
    ('b', 2),
    ('c', 3)
]

for i in range(len(items)):
    def dummy_func(bot, update):
        print(items[i][1])

    updater.dispatcher.add_handler(
        CommandHandler(items[i][0], dummy_func)
    )

updater.start_polling()

例如,我希望在我的控制台中/a打印1,而是3为 a、b 或 c 打印。我想也许该函数每次都存储在内存中的同一位置,并尝试将回调存储在列表中,但没有帮助。

关于如何做到这一点的任何想法?

伊万·维诺格拉多夫

tldr;

这个问题不属于电报机器人或python-telegram-bot库。
这只是Python 语言的一个特性
这背后的原因有点类似于列表理解python 行为中著名的lambda 函数


测试用例

考虑一下脚本的这个稍微简化的版本:

items = [
    ('a', 1),
    ('b', 2),
    ('c', 3)
]

handlers = []  # think of dispatcher handlers as a list
for i in range(len(items)):
    def dummy_func():  # <--- closure
        print(items[i][1])  

    handlers.append(dummy_func)  # somewhat similar to dispatcher.add_handler()

for f in handlers:  # let's see the results
    f()

它输出的结果与您得到的结果完全相同:

3
3
3


解释

您会得到相同的结果,因为您通过定义内部循环并在 func 本身内部使用来创建闭包dummy_funcforitems[i][1]

问题是您可能不希望只有在实际执行此特定函数时dummy_func才会引用变量i

并且因为它是在for循环结束后执行的,所以它的值i是它在循环中的最后一个值。因此,您的所有函数都引用 的相同值i,即2,并且在这种情况下items[i][1]将始终3如此。


链接

关于 Python 中的作用域和闭包的好文章关于闭包的
GitHub要点

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在python中为Telegram bot设置webhook?

来自分类Dev

在 Telepot 中运行 handle(msg)(telegram bot python 包)

来自分类Dev

python-telegram-bot在对话处理程序之间传递参数

来自分类Dev

在heroku上托管python telegram bot

来自分类Dev

使Python-Telegram-Bot持久化

来自分类Dev

如何使用Telegram Bot API获取Telegram频道用户列表

来自分类Dev

如何在 Telegram BOT 中接收 CallbackQuery

来自分类Dev

Telegram-bot Java 中的 ScheduledThreadPoolExecutor

来自分类Dev

在python-telegram-bot中如何获取小组的所有参与者?

来自分类Dev

无法使用Python Telegram bot将文件保存在自定义路径目录中

来自分类Dev

如何在python-telegram-bot中更新时间变量字符串

来自分类Dev

如何通过python-telegram-bot接收file_id?

来自分类Dev

如何使用python-telegram-bot转发消息

来自分类Dev

如何通过python-telegram-bot接收file_id?

来自分类Dev

在Telegram bot中有效处理并发回复

来自分类Dev

如何将URL添加到Telegram Bot的InlineKeyboardButton

来自分类Dev

从 nuget 添加 Telegram.Bot 后,MVC 编译失败

来自分类Dev

Telegram bot在群聊中没有响应

来自分类Dev

Telegram Bot如何从频道或组中删除或删除消息或媒体

来自分类Dev

如何在Telegram bot中从用户获取输入(例如名字)?

来自分类Dev

php telegram bot中的“与我们联系”按钮

来自分类Dev

如何在C#中的Telegram bot中使用SendDocumentAsync?

来自分类Dev

如何让 Telegram Bot 从提及中获取用户信息

来自分类Dev

Telegram Bot中的“ Microsoft.Bot.Schema.APIException”异常部署在Azure上

来自分类Dev

Telegram Bot 不回复消息

来自分类Dev

托管 C# Telegram Bot

来自分类Dev

尝试通过python-telegram-bot发送sendPhoto时出现UnicodeDecodeError

来自分类Dev

python-telegram-bot错误“ CallbackContext”对象没有属性“ message”

来自分类Dev

python telegram bot:为什么数字是指向电话号码的链接?

Related 相关文章

  1. 1

    如何在python中为Telegram bot设置webhook?

  2. 2

    在 Telepot 中运行 handle(msg)(telegram bot python 包)

  3. 3

    python-telegram-bot在对话处理程序之间传递参数

  4. 4

    在heroku上托管python telegram bot

  5. 5

    使Python-Telegram-Bot持久化

  6. 6

    如何使用Telegram Bot API获取Telegram频道用户列表

  7. 7

    如何在 Telegram BOT 中接收 CallbackQuery

  8. 8

    Telegram-bot Java 中的 ScheduledThreadPoolExecutor

  9. 9

    在python-telegram-bot中如何获取小组的所有参与者?

  10. 10

    无法使用Python Telegram bot将文件保存在自定义路径目录中

  11. 11

    如何在python-telegram-bot中更新时间变量字符串

  12. 12

    如何通过python-telegram-bot接收file_id?

  13. 13

    如何使用python-telegram-bot转发消息

  14. 14

    如何通过python-telegram-bot接收file_id?

  15. 15

    在Telegram bot中有效处理并发回复

  16. 16

    如何将URL添加到Telegram Bot的InlineKeyboardButton

  17. 17

    从 nuget 添加 Telegram.Bot 后,MVC 编译失败

  18. 18

    Telegram bot在群聊中没有响应

  19. 19

    Telegram Bot如何从频道或组中删除或删除消息或媒体

  20. 20

    如何在Telegram bot中从用户获取输入(例如名字)?

  21. 21

    php telegram bot中的“与我们联系”按钮

  22. 22

    如何在C#中的Telegram bot中使用SendDocumentAsync?

  23. 23

    如何让 Telegram Bot 从提及中获取用户信息

  24. 24

    Telegram Bot中的“ Microsoft.Bot.Schema.APIException”异常部署在Azure上

  25. 25

    Telegram Bot 不回复消息

  26. 26

    托管 C# Telegram Bot

  27. 27

    尝试通过python-telegram-bot发送sendPhoto时出现UnicodeDecodeError

  28. 28

    python-telegram-bot错误“ CallbackContext”对象没有属性“ message”

  29. 29

    python telegram bot:为什么数字是指向电话号码的链接?

热门标签

归档