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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:39:04