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

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

额外优化建议

  1. 简化判断逻辑:列表中判断元素是否存在可以直接用in关键字,无需手动循环:
# 同步版本简化
def checker_ping(id):
    return id in data

# 异步版本简化(若非要保留async)
async def checker_ping(id):
    return id in data
  1. 安全读取文件:用with语句自动管理文件资源,避免泄漏:
import re

with open('pings.txt', 'r+') as file:
    data = list(re.sub(":.", '', ''.join(file.readlines())).splitlines())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:52:42