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
相关产品推荐
相关产品推荐

