discord.py命令组的子命令是否会继承父命令的装饰器配置?
discord.py 父命令组权限继承问题解答
结论
默认情况下,你给set父命令组添加的@has_permissions权限校验规则不会被其子命令/子分组自动继承。
原因说明
discord.py 的装饰器仅直接作用于被装饰的函数本身:
- 你给
set根命令挂载的权限校验,只会在用户直接调用根命令(比如/set)的时候触发 - 当用户调用
set channel这类子命令时,只会执行子命令自身挂载的校验规则,不会触发父命令的权限校验
按你当前给出的代码,普通用户无法调用根set命令,但可以无阻碍调用set channel下的所有子功能,不符合你的权限管控需求。
解决方法
方法1:直接给所有子命令/子分组单独加权限装饰器
最直接稳妥的写法,适配所有场景:
@set.group() @has_permissions(manage_server=True) async def channel(): # 你的功能逻辑
方法2:抽离公共权限装饰器减少重复代码
如果子命令数量多,可以把权限规则抽成公共装饰器复用:
# 提前定义公共权限校验装饰器 manage_server_required = has_permissions(manage_server=True) # 父命令使用 @bot.group() @manage_server_required async def set(): pass # 子命令直接复用即可 @set.group() @manage_server_required async def channel(): pass
内容的提问来源于stack exchange,提问作者DavyJonesStockings
相关产品推荐
相关产品推荐

