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

Discord机器人执行+del删除鼓励语指令时返回ObservedList报错如何解决

问题原因

你看到的输出不是报错,是你使用的Replit内置数据库返回的列表为自定义的ObservedList类型,而非Python原生列表。直接将该类型对象发送到频道时,会输出该对象的默认字符串表示,也就是你看到的带ObservedList(value=...)的内容。
另外你贴出的代码存在缩进错误:所有@client.event装饰的事件函数都被缩进在了delete_encouragement函数内部,若实际运行代码也是这个结构,会导致事件无法正常注册触发,需先修正缩进层级。

修复方案

1. 解决输出格式问题

你可以在操作数据库内的鼓励语列表时直接取ObservedList的value属性(你拼接options变量时已经用到了这个写法),就能拿到原生Python列表:

# 把delete_encouragement函数修改为直接操作原生列表
def delete_encouragement(index):
  encouragements = db["encouragements"].value
  if len(encouragements) > index:
    del encouragements[index]
    db["encouragements"] = encouragements

2. 优化删除指令的逻辑

增加容错处理,避免用户输入非数字、序号超出范围时程序报错,同时优化输出格式更易读:

if msg.startswith("+del"):
    encouragements = []
    if "encouragements" in db.keys():
        # 处理输入不合法的情况
        try:
            index = int(msg.split("+del",1)[1].strip())
        except (ValueError, IndexError):
            await message.channel.send("请输入正确的删除序号,格式为:+del 序号")
            return
        # 校验序号范围
        all_encouragements = db["encouragements"].value
        if 0 <= index < len(all_encouragements):
            delete_encouragement(index)
            updated_encouragements = db["encouragements"].value
            # 格式化输出列表
            output_msg = "删除成功,当前自定义鼓励语列表:\n"
            for i, content in enumerate(updated_encouragements):
                output_msg += f"{i}. {content}\n"
            await message.channel.send(output_msg)
        else:
            await message.channel.send("输入的序号超出范围,请检查后重试")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:15:03