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

