Discord异步机器人报错:coroutine 'checker_ping'未被await的问题
Discord机器人RuntimeWarning解决方法:未await异步函数的问题
问题根源
你定义的checker_ping是异步函数(async def声明),但调用时直接写checker_ping(message.author.id),没有添加await关键字。Python会将其视为未执行的协程对象,因此抛出RuntimeWarning: coroutine 'checker_ping' was never awaited警告。
你觉得机器人“正常回复”其实是巧合:协程对象在布尔判断中会被视为True,所以不管用户ID是否在pings.txt列表里,都会触发消息发送,实际逻辑是错误的。
两种解决方法
方法1:给异步函数调用添加await
保留异步函数的前提下,调用时必须用await获取返回值,才能正确执行判断:
if message.mention_everyone: # 添加await关键字获取异步函数的返回值 if await checker_ping(message.author.id): await message.channel.send("U used a ping") async def checker_ping(id): for i in data: if id == i: return True # 必须添加默认返回值,否则未匹配时返回None(视为False) return False
方法2:将函数改为普通同步函数(推荐)
checker_ping内部只是同步的列表遍历,完全不需要异步,改成普通函数后无需await,更高效:
if message.mention_everyone: # 直接调用普通函数,无需await if checker_ping(message.author.id): await message.channel.send("U used a ping") # 去掉async,改为普通函数 def checker_ping(id): for i in data: if id == i: return True return False
额外优化建议
- 简化判断逻辑:列表中判断元素是否存在可以直接用
in关键字,无需手动循环:
# 同步版本简化 def checker_ping(id): return id in data # 异步版本简化(若非要保留async) async def checker_ping(id): return id in data
- 安全读取文件:用
with语句自动管理文件资源,避免泄漏:
import re with open('pings.txt', 'r+') as file: data = list(re.sub(":.", '', ''.join(file.readlines())).splitlines())
内容的提问来源于stack exchange,提问作者purgatorian
相关产品推荐
相关产品推荐

