Discord机器人添加角色报UnboundLocalError错误求助
问题分析与修复
错误原因
- 变量未定义:只有当表情ID匹配时才会定义
role和role2,如果表情不匹配,这两个变量就不存在,后续判断role is not None时直接触发未绑定变量错误。 - 类型不匹配:
payload.emoji.id是整数类型,你用字符串'1032324082110304288'做比较,会导致匹配失败,永远走不到定义变量的分支。
修复后的代码
async def on_raw_reaction_add(payload): if payload.channel_id == 1030905311231483904: guild = bot.get_guild(payload.guild_id) # 提前初始化角色变量为None,避免未定义问题 role = None role2 = None # 表情ID用整数类型匹配 if payload.emoji.id == 1032324082110304288: role = discord.utils.get(guild.roles, name='Temporary') role2 = discord.utils.get(guild.roles, name='Not-Verified') if role is not None and role2 is not None: msg = await bot.get_channel(payload.channel_id).fetch_message(payload.message_id) member = msg.author if member is not None: await member.add_roles(role) await member.remove_roles(role2) await member.send("You have been Verified! Enjoy 2883 discord server! Please select your alliance role and troop type!") print('done') else: print('member not found') else: print('role not found') else: pass
关键修改点
- 用
bot.get_guild(payload.guild_id)替代discord.utils.find,更高效且代码更简洁。 - 提前初始化
role和role2为None,确保无论表情是否匹配,变量都已定义。 - 将表情ID改为整数类型,和
payload.emoji.id的类型保持一致,保证匹配逻辑正常。 - 增加
role2 is not None的判断,避免移除角色时出现变量未定义的问题。 - 简化DM发送逻辑,直接用
await member.send()替代创建DM通道的步骤。
内容的提问来源于stack exchange,提问作者AimedEye
相关产品推荐
相关产品推荐

