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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:04