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

Discord.py:如何调用message参数而不触发member匹配?

问题原因

discord.py 的命令解析器会按参数定义的顺序匹配位置参数。当你输入纯文本内容时,系统会优先尝试将其解析为前面的 discord.Member 参数,找不到对应成员时就会抛出 MemberNotFound 错误。

解决方法

方法1:将member设为关键字-only参数

通过*标记关键字参数的起始,强制member必须通过关键字指定,这样纯文本内容会直接匹配message参数,不会触发成员解析。

修改后的代码:

@bot.hybrid_command(description='Test Command')
async def test(ctx: commands.Context, message=None, *, member: discord.Member=None):
    
    if message and member:
        return await ctx.reply(f"Test message and member are: {message} und {member.mention}", mention_author=False)
    elif message is None and member is not None:
        return await ctx.reply(f"Test member is: {member.mention}", mention_author=False)
    elif member is None and message is not None:
        return await ctx.reply(f"Test message is: {message}", mention_author=False)
    else:
        return await ctx.reply(f"Test failed", mention_author=False)

使用方式:

  • 仅输入消息:!test Hello World 或 /test message:Hello World
  • 仅指定成员:!test member=@用户名 或 /test member:@用户名
  • 同时输入两者:!test Hello World member=@用户名 或 /test message:Hello World member:@用户名

方法2:用贪婪匹配接受剩余文本(支持位置指定成员)

如果需要保留成员的位置指定能力(比如!test @用户名 Hello),可以将message设为贪婪参数,接受所有剩余输入内容。此时系统会先尝试匹配member,匹配失败则自动将member设为None,并把所有文本作为message。

修改后的代码:

@bot.hybrid_command(description='Test Command')
async def test(ctx: commands.Context, member: discord.Member=None, *, message=None):
    
    if message and member:
        return await ctx.reply(f"Test message and member are: {message} und {member.mention}", mention_author=False)
    elif message is None and member is not None:
        return await ctx.reply(f"Test member is: {member.mention}", mention_author=False)
    elif member is None and message is not None:
        return await ctx.reply(f"Test message is: {message}", mention_author=False)
    else:
        return await ctx.reply(f"Test failed", mention_author=False)

使用方式:

  • 仅输入消息:!test Hello World
  • 仅指定成员:!test @用户名
  • 同时输入两者:!test @用户名 Hello World

注:原代码中第三个分支的回复文案有误(写成了Test member is: {message}),已在上述代码中修正为Test message is: {message}。

内容的提问来源于stack exchange,提问作者Taycen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:40:26