Discord.py 实现同一命令不同参数输出:AddToDo无参数时的纠错提示
无类结构下实现无参数提示的改造
核心逻辑
框架默认行为说明:Discord.py默认会校验命令的必填参数,如果用户不带参数触发命令,会直接返回内置的参数缺失错误,不会进入自定义的命令逻辑。要实现自定义纠错提示,需要把待办项参数设为可选,手动完成空值判断。
改造后的可运行代码
# 初始化用户待办存储结构:key为用户名,value为对应用户的待办列表 ToDoList = {} @bot.command(pass_context=True) async def AddToDo(ctx, ToDoItem: str = None): # 无参数场景发送纠错提示 if ToDoItem is None: await ctx.send("⚠️ 你没有输入待办内容,请按照格式使用:$AddToDo 待办事项内容") return # 修复原代码的共享列表bug:为每个用户初始化独立的空待办列表 if ctx.author.name not in ToDoList: ToDoList[ctx.author.name] = [] ToDoList[ctx.author.name].append(ToDoItem) await ctx.send(f"Successfully added {ToDoItem} to your To Do List!")
改动要点
- 给
ToDoItem添加= None默认值,放开参数校验,允许空参数触发命令 - 空参数时直接发送提示并终止后续逻辑,不执行待办添加流程
- 替换原代码中复用的全局
temporaryList,避免不同用户的待办数据混杂
引入类结构(Discord.py Cog)的实现语法
Discord.py官方推荐的类结构,核心是把同功能的命令、关联数据封装为独立的Cog模块,降低多命令场景下的代码维护成本,对应语法规则如下:
类结构核心规则
- 功能封装类必须继承
commands.Cog基类 - 类的初始化方法接收bot实例,可在初始化时挂载模块专属的存储数据,减少零散的全局变量
- 类内部定义命令时,使用
@commands.command()装饰器标注,方法第一个参数固定为self,后续才是命令上下文ctx和自定义参数 - 类写完后需要实现异步
setup函数,将Cog实例注册到bot上完成加载
类结构实现待办命令的示例代码
from discord.ext import commands # 待办功能专属的Cog类 class ToDoModule(commands.Cog): def __init__(self, bot): self.bot = bot # 待办数据存储在类实例属性上,和其他功能模块隔离 self.user_todo_map = {} @commands.command(name="AddToDo") async def add_todo(self, ctx, todo_item: str = None): if todo_item is None: await ctx.send("⚠️ 你没有输入待办内容,请按照格式使用:$AddToDo 待办事项内容") return if ctx.author.name not in self.user_todo_map: self.user_todo_map[ctx.author.name] = [] self.user_todo_map[ctx.author.name].append(todo_item) await ctx.send(f"Successfully added {todo_item} to your To Do List!") # Cog自动加载入口 async def setup(bot): await bot.add_cog(ToDoModule(bot))
新手注意点
- 新版Discord.py(1.0及以上版本)默认开启上下文传递,原代码里的
pass_context=True已经是内置默认行为,不需要额外标注 - 类结构中的命令不需要手动通过
bot.command()注册,只要Cog被成功加载到bot上,命令就会自动生效
内容的提问来源于stack exchange,提问作者Sophie u
相关产品推荐
相关产品推荐

