Discord.py如何判断消息作者是否拥有给定列表中的任意身份组
故障原因
你的代码逻辑出错核心有两个问题:
discord.utils.find仅会返回遍历范围内第一个匹配到的角色对象,你当前从整个服务器的角色列表中搜索,最终得到的role变量永远是premium、verified两个角色中排序靠前的那一个,判断逻辑只会校验这一个角色的持有情况,不会覆盖整个列表。- 你当前的判断逻辑是「判断服务器里找到的那个匹配角色是否不在用户的角色列表中」,和你要的「判断用户是否持有列表中任意一个角色」的需求完全不匹配。
正确实现方案
推荐直接用Python内置的any()函数遍历用户持有的角色做匹配,逻辑最直观,性能也最优:
author = await context.guild.fetch_member(context.author_id) # 定义要匹配的角色名集合,用集合做包含查询的效率远高于列表 target_role_names = {'premium', 'verified'} # 校验用户是否持有任意一个目标角色,返回布尔值 has_matched_role = any(role.name in target_role_names for role in author.roles) # 如果你需要「用户不持有任意一个目标角色」时执行代码,用如下判断 if not has_matched_role: # 你的业务代码 # 如果你需要「用户持有任意一个目标角色」时执行代码,用如下判断 if has_matched_role: # 你的业务代码
如果你需要额外获取到用户持有的匹配角色对象做后续操作,可以调整为discord.utils.find的写法:
author = await context.guild.fetch_member(context.author_id) target_role_names = {'premium', 'verified'} # 直接在用户持有的角色范围内搜索匹配项 matched_role = discord.utils.find(lambda r: r.name in target_role_names, author.roles) # 没有匹配到任何角色时执行代码 if not matched_role: # 你的业务代码
内容的提问来源于stack exchange,提问作者Gino
相关产品推荐
相关产品推荐

