You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

python-telegram-bot:如何为run_repeating绑定的ericsson_alarm传参?

解决python-telegram-bot定时任务传参问题

问题分析

你的代码存在两个关键问题导致参数传递失败:

  1. 定时任务函数签名错误:ericsson_alarm声明了Update参数,但定时任务触发时不会传入该对象,会引发参数不匹配错误。
  2. 参数获取逻辑错误:你通过run_repeating的data参数传入了controllers,但函数里试图从context.job.context['controllers']取值——实际上context.job.context直接就是你传入的controllers字典,而非嵌套字典。

修正方案

1. 调整定时任务函数

修改ericsson_alarm函数,去掉不需要的Update参数,并正确读取传入的controllers:

async def ericsson_alarm(context: ContextTypes.DEFAULT_TYPE):
    # 直接获取传入的controllers对象
    controllers = context.job.context
    for controller in controllers.values():
        alarm = controller.get_alarms()
        if alarm:
            # 需指定parse_mode才能使<code>标签生效
            await context.bot.send_message(chat_id='-ID', text=f"<code>{alarm}</code>", parse_mode='HTML')

2. 保持参数传递代码不变

main函数中的run_repeating调用无需修改,已经正确传入参数:

job_queue.run_repeating(ericsson_alarm, interval=10, first=10, data=controllers)

可选:多参数传递方式

如果后续需要传递多个参数,可将data设为字典:

# main函数中传入多参数字典
job_queue.run_repeating(ericsson_alarm, interval=10, first=10, data={'controllers': controllers, 'chat_id': '-ID'})

# 对应修改ericsson_alarm函数
async def ericsson_alarm(context: ContextTypes.DEFAULT_TYPE):
    job_data = context.job.context
    controllers = job_data['controllers']
    chat_id = job_data['chat_id']
    for controller in controllers.values():
        alarm = controller.get_alarms()
        if alarm:
            await context.bot.send_message(chat_id=chat_id, text=f"<code>{alarm}</code>", parse_mode='HTML')

Lambda传参的正确用法

如果想用Lambda传递参数,需确保Lambda是异步的,且参数匹配:

# main函数中替换run_repeating调用
job_queue.run_repeating(lambda context: ericsson_alarm(context, controllers), interval=10, first=10)

# 对应修改ericsson_alarm函数接收额外参数
async def ericsson_alarm(context: ContextTypes.DEFAULT_TYPE, controllers):
    for controller in controllers.values():
        alarm = controller.get_alarms()
        if alarm:
            await context.bot.send_message(chat_id='-ID', text=f"<code>{alarm}</code>", parse_mode='HTML')

不过这种方式不如data参数直观,推荐优先使用官方提供的参数传递方式。

内容的提问来源于stack exchange,提问作者Suhoy571

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 23:15:57