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

discord_slash注册子命令报TypeError: 'SubcommandObject'不可迭代如何解决

报错原因

这个报错触发的核心是discord-py-slash-command库的子命令注册规则被违反:你直接注册了归属到subcommand_group=get、base=present的子命令,但系统里present基础命令下的get已经被注册成了一个独立的子命令对象,而非子命令分组,所以无法在非分组的对象下遍历添加新的子命令。

排查步骤
  • 全局搜索代码中所有用@slash.subcommand修饰、且base='present'的函数:
    1. 确认是否存在直接把name='get'同时未设置subcommand_group的注册逻辑,这种写法会把get注册成present下的普通子命令,而非分组
    2. 确认所有subcommand_group='get'的注册逻辑,是否都晚于子命令分组的声明
  • 检查是否跳过了子命令分组的显式声明步骤,老版本的discord-py-slash-command要求先声明基础命令、再声明子命令分组,最后才能注册分组下的子命令
解决方法

按照正确的注册顺序调整代码即可:

  1. 首先注册基础命令present
# 先注册顶层基础命令
@slash.slash(name="present", description="礼物相关命令")
async def present(ctx):
    # 基础命令如果没有独立触发逻辑可以留空,用户直接输入/present时会自动展示子命令列表
    pass
  1. 然后声明present下的子命令分组get,不要给分组写同名的子命令实现
# 注册子命令分组,仅需要声明分组存在即可
@slash.subcommand(base="present", name="get", description="领取礼物相关操作")
async def _present_get_group(ctx):
    pass
  1. 最后注册分组下的子命令lot,原有业务逻辑不需要修改
@slash.subcommand(name='lot', base='present', subcommand_group='get', description="领取抽签礼物")
async def get_lot(ctx):
    # 你的原有业务代码
  • 如果确认不需要get作为单独可触发的子命令,直接删掉所有把get注册为普通子命令的逻辑即可
  • 如果你用的是v3以上版本的discord-py-interactions(原discord-py-slash-command已更名),可以用更简单的分组装饰器写法避免顺序问题,不需要单独声明空的分组函数:
# v3+版本写法
present_group = SlashCommandGroup(name="present", description="礼物相关命令")
get_group = present_group.create_subgroup(name="get", description="领取相关操作")

@get_group.command(name="lot")
async def get_lot(ctx):
    # 业务代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 20:27:03