Discord.py 创建参数数量校验装饰器及ctx.args为空问题排查
问题根因
你遗漏了commands.check的执行时机要点:discord.py的校验装饰器运行在命令参数解析流程之前,此时ctx.args和ctx.kwargs还未被框架填充,所以无论传多少参数读取结果都是空的。
最优实现方案
方案1:通用校验装饰器(适配所有无额外参数的命令)
直接在校验逻辑中读取原始消息内容,判断命令后是否有多余输入即可:
def no_extra_args(): def predicate(ctx): # 截取掉前缀和命令名后的剩余内容 remain_content = ctx.message.content[len(ctx.prefix) + len(ctx.invoked_with):].strip() if remain_content: raise commands.TooManyArguments("当前命令不支持传入额外参数") return True return commands.check(predicate)
使用时直接在命令上挂载装饰器即可,不需要每个函数内部写判断:
@commands.command(name='hi') @commands.is_owner() @no_extra_args() async def hi(self, ctx): await ctx.send('hi')
方案2:原生框架特性(无特殊需求优先用这个)
如果你的命令本身不需要接收任何参数,直接删掉函数签名里的*, arg=None即可,discord.py 原生会自动检测多余参数并抛出TooManyArguments错误,不需要额外写校验逻辑。
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

