如何修复discord.py中执行?win @用户命令时出现的KeyError报错
错误原因
你的win命令逻辑仅在未传入@用户参数时,才会调用open_wins对发起命令的用户做数据初始化校验;当传入被@的目标用户时,程序没有对该用户做是否已存在于JSON文件的校验,直接尝试读取其ID对应的胜场字段,自然会抛出KeyError。
修复方案
仅需要调整win命令的逻辑,把初始化操作移到if分支外部,无论是否传入@用户参数都先执行初始化校验即可,其他两个辅助函数不需要修改。
修复后的win命令代码:
@client.command() @commands.has_role("Draft Manager") async def win(ctx,member: discord.Member = None ): if not member: member = ctx.author # 对目标用户统一做初始化校验,无记录则自动创建 await open_wins(member) users = await get_win_data() user = member onewin = 1 # 可选优化提示语,适配给他人加胜场的场景 if user == ctx.author: await ctx.send(f"You just gained {onewin} win ") else: await ctx.send(f"{user.mention} just gained {onewin} win ") users[str(user.id)]["Wins"] += onewin with open("leaderboard.json", "w") as f: json.dump(users, f, indent=4)
逻辑说明
open_wins函数本身已经内置了用户存在性判断,已存在记录的用户调用该函数不会产生任何副作用,所以直接把调用逻辑移到分支外即可覆盖所有使用场景,自动为无记录的用户创建ID和胜场条目。
内容的提问来源于stack exchange,提问作者Alex is funny
相关产品推荐
相关产品推荐

