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

discord.py如何实现允许持有多个指定角色中任一的用户触发命令

问题原因

@commands.has_role 装饰器本身仅支持传入单个角色参数,你写的 "Lab Demonstrator" OR "Staff" 是Python的逻辑运算,最终只会返回第一个非空值也就是 "Lab Demonstrator",本质还是只校验单个角色,自然达不到效果。

解决方案

方案1:使用内置的多角色校验装饰器

discord.py 已经提供了原生支持多角色校验的装饰器has_any_role,直接把需要校验的所有角色名作为参数传入即可,只要用户持有任意一个符合要求的角色就能通过校验:

@commands.has_any_role("Lab Demonstrator", "Staff", "teacher")

如果想要更高的稳定性,避免服务器修改角色名导致校验失效,也可以传入角色ID代替角色名:

# 括号内替换为三个角色对应的实际ID
@commands.has_any_role(101234567890123456, 101234567890123457, 101234567890123458)

方案2:自定义校验规则(适合复杂场景)

如果后续还有其他自定义校验逻辑,可以自己写校验函数配合commands.check装饰器使用:

# 先定义自定义校验装饰器
def check_allowed_role():
    def predicate(ctx):
        allowed_role_names = {"Lab Demonstrator", "Staff", "teacher"}
        # 遍历用户所有角色判断是否有符合要求的
        return any(role.name in allowed_role_names for role in ctx.author.roles)
    return commands.check(predicate)

# 在命令上添加该装饰器即可
@check_allowed_role()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:48:01