Telegram Bot调用自定义函数报keyF未定义错误如何修复
报错原因
comand函数中定义的keyF是函数局部变量,作用域仅在comand函数内部生效,函数执行完毕后局部变量会被销毁,外部的回调查询处理函数无法访问到该变量,因此触发name 'keyF' is not defined错误。
修复方法
调整comand函数逻辑,将构建完成的内联键盘对象作为返回值返回,调用comand时用变量接收返回值后,再作为reply_markup参数传入即可。
修复后代码如下:
def comand(a,b): keyF = types.InlineKeyboardMarkup(resize_keyboard=True) btnOne = types.InlineKeyboardButton(text="BACK PAGE", callback_data=a) btnTwo = types.InlineKeyboardButton(text="NEXT PAGE", callback_data=b) keyF.add(btnOne, btnTwo) # 返回构建好的键盘实例 return keyF @by.callback_query_handler(text="TWO1") async def send_random_value(call: types.CallbackQuery): # 接收函数返回的键盘对象 keyF = comand("TWO2", "TWOBACK1") await call.message.answer(lists[1], reply_markup=keyF)
注意:不建议为了方便在这个场景使用
global声明全局变量,全局变量容易在多用户并发触发回调时出现键盘参数错乱的问题,用函数返回值传参是更安全规范的写法。
内容的提问来源于stack exchange,提问作者Dolemka
相关产品推荐
相关产品推荐

