Discord机器人命令函数疑问:return变量与自回复规避方法
嘿,这两个问题都是discord.py开发里常见的小坑,我来给你理清楚!
问题1:Command函数中使用return语句需要指定什么变量?
其实在discord.py的命令函数里,你完全不需要指定特定变量就能用return。return在这里的核心作用就是提前终止函数执行——比如当你触发了某个不想继续处理的条件时,直接写return就可以退出当前的异步函数,不会再执行后面的代码。
举个简单例子,如果你想在用户权限不够时直接停止命令,就可以这样写:
@client.command() async def test(ctx): if not ctx.author.guild_permissions.administrator: await ctx.send("你没有权限执行这个命令!") return # 直接终止,不会执行后面的逻辑 # 这里是有权限才会执行的代码 await ctx.send("执行成功!")
在@client.command()装饰的命令函数里,你拿到的上下文对象是ctx(也就是你代码里async def amy(ctx)的参数),所以要判断命令发起者是不是机器人自己,应该用ctx.author来代替message.author。
你之前的错误在于,message是on_message事件监听函数的专属参数,命令函数里并没有这个变量;而ctx(上下文)包含了所有你需要的会话信息——包括发起命令的用户(ctx.author)、所在频道(ctx.channel)、服务器(ctx.guild)等等。
修正后的命令函数代码:
@client.command() async def amy(ctx): if ctx.author == client.user: return else: gif = discord.Embed(color = 0x83B5E3) gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif') await ctx.channel.send(embed=gif)
另外顺便帮你修正一下on_message事件里的小错误:你在事件函数里写了await ctx.channel.send(...),但事件函数的参数是message,没有ctx,应该改成await message.channel.send(...),修正后的代码:
@client.event async def on_message(message): if message.author == client.user: return else: gif = discord.Embed(color = 0x83B5E3) gif.set_image(url = 'https://media.giphy.com/media/2yyKE8ZEgrAXPx5gwI/giphy.gif') await message.channel.send(embed=gif)
内容的提问来源于stack exchange,提问作者Amy sdj
相关产品推荐
相关产品推荐

