aiogram内联按钮点击报错:无法在await表达式中使用bool对象
问题原因分析
错误的核心在于回调查询处理器的注册方式错误:
在handlers_admin函数中,这行代码存在致命问题:
dp.register_callback_query_handler(lambda x: x.data and x.data.startswith('del '))
register_callback_query_handler的第一个参数必须是异步处理函数,但这里传入的是一个返回布尔值的lambda表达式。当Telegram触发回调查询时,调度器会尝试await这个lambda的返回值(布尔值),而布尔值不是可等待对象,因此抛出TypeError: object bool can't be used in 'await' expression。
解决方法
修改回调处理器的注册代码,将del_callback作为处理函数传入,把lambda作为过滤条件放在参数末尾:
dp.register_callback_query_handler(del_callback, lambda x: x.data and x.data.startswith('del '))
额外优化建议
- 可以使用aiogram内置的
Text过滤器简化判断逻辑,代码更易读:from aiogram.dispatcher.filters import Text # 替换原注册代码 dp.register_callback_query_handler(del_callback, Text(startswith='del ')) - SQLite操作函数无需定义为async函数(sqlite3是同步库,异步包装无意义),改为普通函数即可,同时调用时去掉
await:# 修改sqlite_db.py中的函数 def sql_scan(): return cur.execute('SELECT * FROM menu').fetchall() def sql_delete(data): print('done') cur.execute('DELETE FROM menu WHERE name == ?', (data,)) base.commit()# 在cm_delete中调用 data = sqlite_db.sql_scan() # 在del_callback中调用 sqlite_db.sql_delete(query.data.replace('del ', ''))
内容的提问来源于stack exchange,提问作者Владислав Дирявка
相关产品推荐
相关产品推荐

