discord.py的bot.command中如何将命令调用者设为默认参数
报错原因
Python的函数默认参数是在函数定义阶段就完成求值的,而
ctx.message.author是命令被触发时才会生成的运行时变量,无法在函数定义阶段被提前获取,所以会直接抛出语法/作用域错误。
正确实现方案
discord.py 1.7.3版本下统一用None作为可选参数的占位默认值,在函数内部完成默认值的赋值即可,示例代码如下:
import discord from discord.ext import commands # 示例为Cog类内的命令实现,和你的代码上下文匹配 class LevelSystem(commands.Cog): def __init__(self, bot): self.bot = bot @commands.command(name='rank') async def rank(self, ctx, user: discord.Member = None): # 未传入用户参数时默认取命令调用者 if user is None: user = ctx.author # 等价于ctx.message.author,1.7.3版本支持该简写 # 以下替换为你自己的等级查询逻辑 # 示例伪代码:level, exp = query_user_level(user.id) # 示例返回消息 embed = discord.Embed(title=f"{user.name} 的等级信息", color=discord.Color.green()) embed.add_field(name="当前等级", value="15", inline=True) embed.add_field(name="经验进度", value="4200/5000", inline=True) embed.set_thumbnail(url=user.avatar_url) await ctx.send(embed=embed) # Cog加载逻辑(如果是单独Cog文件需要添加) def setup(bot): bot.add_cog(LevelSystem(bot))
额外注意事项
- 如果需要支持查询不在当前服务器的用户,可以把参数类型改为
discord.User,默认值赋值逻辑不变 - 可以添加
commands.MemberNotFound异常捕获,处理用户输入无效ID/昵称的情况
内容的提问来源于stack exchange,提问作者Random_Pythoneer59
相关产品推荐
相关产品推荐

