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

discord.py中同名不同值的Choice选项均返回同一值的问题

解决Discord.py同名Choice选项值被覆盖的问题

问题分析

你当前的代码里,两个name="Foo"的app_commands.Choice选项,无论选哪一个,最终传给命令的都是第一个选项的value(1)。这是因为Discord API的静态choices机制不允许同一参数下存在同名选项,discord.py在注册命令时会自动覆盖后续的同名选项,导致只有第一个生效。

解决方案

用**自动补全(autocomplete)**替代静态choices,自动补全是动态返回选项,支持同名且能正确区分不同value:

async def foo_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[int]]:
    # 返回两个同名但不同值的选项
    return [
        app_commands.Choice(name="Foo", value=1),
        app_commands.Choice(name="Foo", value=2)
    ]

@bot.tree.command(name="abc", description="123")
@app_commands.autocomplete(myarg=foo_autocomplete)
async def abc(ctx: discord.Interaction, myarg: int):
    # 现在选择不同的"Foo"会返回对应的value
    if myarg == 1:
        await ctx.response.send_message("你选了第一个Foo")
    elif myarg == 2:
        await ctx.response.send_message("你选了第二个Foo")

原理说明

  • 静态choices是在命令注册时同步到Discord API,API层面会对同名选项去重,导致后续选项被覆盖。
  • 自动补全是在用户输入命令时动态返回选项列表,客户端会根据每个选项的唯一value传递参数,即使名称相同也能正确区分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:22