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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 10:36:08