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

discord.py斜杠命令:如何实现学位与班级的动态关联参数

解决discord.py斜杠命令中动态依赖参数的班级选择问题

核心问题

你需要实现一个斜杠命令,让用户先选择学位(ciclo),再根据所选学位动态显示对应的班级(clase)选项,但直接绑定枚举的写法无法实现参数依赖,导致多种报错:

  • clase: {Ciclos.name} / clase: Ciclos.name:触发AttributeError,因为Ciclos类本身没有name属性,name是枚举实例的专属属性
  • clase: ciclo:触发NameError,参数定义阶段无法访问未定义的ciclo变量

解决方案

使用discord.py的**自动补全(app_commands.autocomplete)**功能,实现班级选项的动态生成,这是处理参数依赖的标准方式。

完整代码实现

import enum
import discord
from discord import app_commands

# 学位枚举(value设为字符串,方便直接拼接文件名)
class Ciclos(enum.Enum):
    ASIX = "ASIX"
    DAM = "DAM"

# 各学位对应的班级枚举
class ASIXClases(enum.Enum):
    _1A = "1A"
    _1B = "1B"
    _1C = "1C"
    _2A = "2A"
    _2B = "2B"

class DAMClases(enum.Enum):
    _1A = "1A"
    _2A = "2A"
    _2B = "2B"

# 学位到对应班级枚举的映射表
CICLO_TO_CLASES = {
    Ciclos.ASIX: ASIXClases,
    Ciclos.DAM: DAMClases
}

# 班级选项自动补全函数:根据用户已选学位返回对应班级
async def clase_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
    # 从交互数据中提取用户已选择的学位值
    selected_ciclo_val = interaction.data["options"][0]["value"]
    # 转换为枚举实例
    ciclo_enum = Ciclos(selected_ciclo_val)
    # 获取对应学位的班级枚举
    clases_enum = CICLO_TO_CLASES[ciclo_enum]

    # 生成匹配用户输入的选项(支持模糊匹配)
    return [
        app_commands.Choice(name=clase.name.lstrip("_"), value=clase.value)
        for clase in clases_enum
        if current.lower() in clase.name.lower()
    ]

@bot.tree.command(name="schedule", description="显示所选班级的课程表")
@app_commands.describe(ciclo="选择你的学位", clase="选择你的班级")
# 给clase参数绑定自动补全函数
@app_commands.autocomplete(clase=clase_autocomplete)
async def schedule(interaction: discord.Interaction, ciclo: Ciclos, clase: str):
    # 拼接课程表图片路径
    file_path = f"Media/schedules/schedule{ciclo.value}_{clase}.png"
    try:
        await interaction.response.send_message(file=discord.File(file_path))
    except FileNotFoundError:
        # 发送私有消息提示文件不存在,避免刷屏
        await interaction.response.send_message("找不到对应班级的课程表图片,请检查文件路径!", ephemeral=True)

关键细节说明

  1. 枚举结构优化:把Ciclos的value设为字符串,直接用于文件名拼接,无需额外转换;将各学位的班级拆分为独立枚举,便于后续维护。
  2. 自动补全逻辑:通过interaction.data获取用户已选择的学位,动态返回对应的班级选项,同时支持模糊匹配用户输入的内容。
  3. 异常处理:增加文件不存在的捕获逻辑,发送私有提示消息,提升用户体验的同时避免公共频道刷屏。
  4. 参数类型调整:clase参数使用str类型,直接接收自动补全返回的班级值,简化后续拼接逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:55:20