python-telegram-bot:如何为run_repeating绑定的ericsson_alarm传参?
解决python-telegram-bot定时任务传参问题
问题分析
你的代码存在两个关键问题导致参数传递失败:
- 定时任务函数签名错误:
ericsson_alarm声明了Update参数,但定时任务触发时不会传入该对象,会引发参数不匹配错误。 - 参数获取逻辑错误:你通过
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
相关产品推荐
相关产品推荐

