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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:06:56