discord_slash注册子命令报TypeError: 'SubcommandObject'不可迭代如何解决
报错原因
这个报错触发的核心是discord-py-slash-command库的子命令注册规则被违反:你直接注册了归属到subcommand_group=get、base=present的子命令,但系统里present基础命令下的get已经被注册成了一个独立的子命令对象,而非子命令分组,所以无法在非分组的对象下遍历添加新的子命令。
排查步骤
- 全局搜索代码中所有用
@slash.subcommand修饰、且base='present'的函数:- 确认是否存在直接把
name='get'同时未设置subcommand_group的注册逻辑,这种写法会把get注册成present下的普通子命令,而非分组 - 确认所有
subcommand_group='get'的注册逻辑,是否都晚于子命令分组的声明
- 确认是否存在直接把
- 检查是否跳过了子命令分组的显式声明步骤,老版本的
discord-py-slash-command要求先声明基础命令、再声明子命令分组,最后才能注册分组下的子命令
解决方法
按照正确的注册顺序调整代码即可:
- 首先注册基础命令
present
# 先注册顶层基础命令 @slash.slash(name="present", description="礼物相关命令") async def present(ctx): # 基础命令如果没有独立触发逻辑可以留空,用户直接输入/present时会自动展示子命令列表 pass
- 然后声明
present下的子命令分组get,不要给分组写同名的子命令实现
# 注册子命令分组,仅需要声明分组存在即可 @slash.subcommand(base="present", name="get", description="领取礼物相关操作") async def _present_get_group(ctx): pass
- 最后注册分组下的子命令
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
相关产品推荐
相关产品推荐

