discord.py rewrite如何将函数名转换为可触发的Discord命令?
示例代码
bot = commands.Bot(command_prefix="$", help_command=None) @bot.command(pass_context=True) async def say(ctx, *, message): await ctx.send(message)
调用该命令的格式为 $say something,对应的注册与识别机制如下:
核心实现机制
整个逻辑基于Python装饰器语法和discord.py内置的命令注册表实现,具体流程:
- 装饰器触发:你给
say函数加@bot.command()装饰器的时候,Python解释器会先执行bot.command(pass_context=True),这个调用会返回一个专门用来处理命令注册的高阶函数 - 函数名读取:返回的高阶函数会接收
say函数作为入参,默认会直接读取函数的__name__属性(也就是字符串"say")作为默认的命令触发名;如果手动给bot.command()传了name参数,比如@bot.command(name="speak"),会优先用传入的名称覆盖函数名 - 命令实例包装:内部会把你写的异步函数、命令名、传入的配置参数打包成一个
Command类的实例 - 存入注册表:这个
Command实例会被添加到bot对象内部的命令映射字典里,键就是命令名"say",值是对应的Command实例 - 运行时匹配:bot启动后收到任意消息时,会先校验消息前缀是否匹配设置的
$,匹配成功后拆分消息内容,取前缀后第一个空格前的字符串作为命令名,去内部的命令字典里查找对应的实例,找到后就调用对应的函数执行逻辑。
内容的提问来源于stack exchange,提问作者Aayaan Sahu
相关产品推荐
相关产品推荐

