discord.py命令如何实现双参数支持关键字传参
问题原因
discord.py 中使用@client.command()装饰的传统前缀命令,默认仅支持按位置顺序匹配参数,不会自动识别参数名=值格式的关键字传参——你写的函数默认参数是Python层面的语法,但机器人解析用户输入的聊天内容时,只会按空格拆分内容后从左到右依次给参数赋值,所以直接写tries=5会被当成第一个参数limit的传入值,自然会调用失败。
解决方案
推荐优先使用discord.py 2.0及以上版本提供的原生应用斜杠命令,不需要自己写解析逻辑,天然支持参数提示、关键字传参、默认值自动补全,是官方推荐的实现方式。
方案1:使用原生斜杠命令(推荐)
代码示例:
import discord from discord import app_commands intents = discord.Intents.default() client = discord.Client(intents=intents) tree = app_commands.CommandTree(client) @tree.command(name="hii", description="灵活传参测试命令") @app_commands.describe(limit="传入limit值,默认1", tries="传入tries值,默认2") async def hii(interaction: discord.Interaction, limit: int = 1, tries: int = 2): await interaction.response.send_message(f"{limit}, {tries} was given") @client.event async def on_ready(): # 同步命令到Discord,全局命令首次同步最长可能需要1小时生效 # 测试阶段可以指定测试服务器ID同步,几秒即可生效:await tree.sync(guild=discord.Object(id=你的服务器ID)) await tree.sync() print(f"机器人已登录:{client.user}") client.run("你的机器人Token")
该实现支持所有灵活传参场景:
- 不传入任何参数:
/hii→ 输出1, 2 was given - 按位置传参:
/hii 4 5→ 输出4, 5 was given - 仅传tries保留limit默认值:
/hii tries:5→ 输出1, 5 was given - 打乱参数顺序传参:
/hii tries:5 limit:4→ 输出4, 5 was given
用户输入命令时Discord会自动弹出参数补全提示,不需要额外记忆参数顺序。
方案2:传统前缀命令自定义解析(不推荐)
如果你必须使用前缀触发的传统命令,可以自己实现参数解析逻辑,兼容位置传参和键值对传参,代码示例:
@client.command() async def hii(ctx, *, raw_args: str = ""): # 初始化默认参数 params = {"limit": 1, "tries": 2} pos_args = [] # 拆分位置参数和键值对参数 for part in raw_args.split(): if "=" in part: key, value = part.split("=", 1) key = key.strip().lower() if key not in params: await ctx.send(f"不存在参数:{key}") return try: params[key] = int(value.strip()) except ValueError: await ctx.send(f"参数{key}的值必须是整数") return else: pos_args.append(part) # 按顺序填充位置参数 for idx, val in enumerate(pos_args): try: val = int(val) except ValueError: await ctx.send("位置参数必须是整数") return if idx == 0: params["limit"] = val elif idx == 1: params["tries"] = val else: break await ctx.send(f"{params['limit']}, {params['tries']} was given")
该实现支持以下传参格式:
/hii→ 输出1, 2 was given/hii 4 5→ 输出4, 5 was given/hii tries=5→ 输出1, 5 was given/hii tries=5 limit=4→ 输出4, 5 was given
内容的提问来源于stack exchange,提问作者Ayush Paudel
相关产品推荐
相关产品推荐

