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 _
相关产品推荐
相关产品推荐

