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

discord.py设置@提及+JSON读取的自定义前缀时报错如何解决?

问题根因

你出现报错的核心原因是 when_mentioned_or 方法的入参要求为字符串类型的固定前缀,你直接传入get_prefix函数对象后,该函数会被识别为前缀列表中的非法非字符串元素,从而触发类型校验报错。

正确实现方案

你需要将@提及触发的逻辑整合到自定义前缀获取函数内部,调整后的代码如下:

def get_prefix(client, message):
    # 适配私信场景,避免无guild时报错
    if not message.guild:
        # 私信场景默认用!作为前缀,可自行修改
        return when_mentioned_or('!')(client, message)
    with open(prefix_file, 'r') as f:
        prefixes = json.load(f)
    guild_prefix = prefixes[str(message.guild.id)]
    # 合并@提及前缀和服务器自定义前缀返回
    return when_mentioned_or(guild_prefix)(client, message)


# 初始化Bot时直接传入自定义前缀函数即可,无需额外嵌套when_mentioned_or
client = commands.Bot(
    command_prefix = get_prefix, 
    description = "Bot by Cucus#0001",
    intents=intents
)
逻辑说明

when_mentioned_or 本质是一个前缀工厂方法,传入固定前缀字符串调用后会返回一个和get_prefix签名一致的可调用对象,接受client和message作为入参,返回包含@提及格式前缀+自定义前缀的列表,刚好符合discord.py对动态前缀函数的返回要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:57:00