如何解决索引错误(以及其他一些问题)?

Posted

技术标签:

【中文标题】如何解决索引错误(以及其他一些问题)?【英文标题】:How do I solve an index error (and some other things too)? 【发布时间】:2021-12-30 16:58:34 【问题描述】:

我正在使用以下链接编写一个不和谐机器人:https://www.youtube.com/watch?v=SPTfmiYiuok

这是一个机器人,旨在在被调用时提供鼓舞人心的消息,用户也可以添加和删除所述消息。 我面临的问题:

A) 每当我输入任何内容时,它都会收到“添加了新的鼓励信息”的命令,即使我没有调用该函数。

B) 代码本身给我一个错误,指出列表索引超出范围。

作为参考,这里是出现错误消息的代码块,以及我怀疑错误所在的范围。 实际的错误是朝向底部的线:

index = int(msg.split("+del",1)[1])'):

这是代码

if msg.startswith('+inspire'):
    quote = get_quote()
    await message.channel.send(quote)

  options = starter_encouragements
  if "encouragements" in db.keys():
    options = options + db["encouragements"].value

  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(options))

  if msg.startswith('+new'):
    encouraging_message = msg.split("+new ",1)[1]
    update_encouragements(encouraging_message)
  await message.channel.send("New encouraging message added :)")

  if msg.startswith("+del"):
    encouragements = []
  if "encouragements" in db.keys():
    index = int(msg.split("+del",1)[1])
    delete_encouragement(index)
    encouragements = db["encouragements"]
    await 
message.channel.send(encouragements)

【问题讨论】:

为什么你添加了androidios标签? 尝试将花括号 添加到您的 IF 语句中,我认为由于缺少空格,await message.channel.send("New encouraging message added :)") 总是会触发。 更新:我能够弄清楚实际领事中给出的错误消息,但我仍然无法弄清楚为什么每当我输入时,它都会给我收到“添加新鼓励消息”的消息'。我曾尝试按照 Luke Duncan 的建议使用花括号,但这只是给出了无效的语法建议。 @Snickzoryx 道歉,我不记得 Python 是否有卷曲,但最新的答案似乎是正确的。 【参考方案1】:

我相信您的代码中的错误与您的缩进有关。在 python 中,缩进对于确保执行什么代码以及在什么控制结构中执行非常重要。

第一个错误:发送每条消息后都发送“添加了新的鼓励消息” 由于缩进错误,每次发送消息时都会运行此代码。这可以通过改变来解决

if msg.startswith('+new'):
  encouraging_message = msg.split("+new ",1)[1]
  update_encouragements(encouraging_message)
await message.channel.send("New encouraging message added :)")

if msg.startswith('+new'):
  encouraging_message = msg.split("+new ",1)[1]
  update_encouragements(encouraging_message)
  await message.channel.send("New encouraging message added :)")

此更改确保您只会在消息以 +new 开头时发送“添加了新的鼓励消息:)”

第二个错误:发送“列表索引超出范围”

您当前使用 split 功能,但由于缩进,无论消息是否以 +del 开头,此代码也会运行 这可以通过改变来解决

  if msg.startswith("+del"):
    encouragements = []
  if "encouragements" in db.keys():
    index = int(msg.split("+del",1)[1])
    delete_encouragement(index)
    encouragements = db["encouragements"]
    await message.channel.send(encouragements)

  if msg.startswith("+del"):
    encouragements = []
    if "encouragements" in db.keys():
      index = int(msg.split("+del",1)[1])
      delete_encouragement(index)
      encouragements = db["encouragements"]
      await message.channel.send(encouragements)

此更改确保您永远不会收到“列表索引超出范围”错误,因为msg 将包含"+del",导致msg.split(+del",1) 返回包含至少两个项目的列表。

【讨论】:

以上是关于如何解决索引错误(以及其他一些问题)?的主要内容,如果未能解决你的问题,请参考以下文章

es索引字段类型错误如何高效解决(如何修改es索引字段类型)

什么是错误错误:返回错误:调用区块链数据时执行恢复以及如何解决?

我创建了通知功能并收到此错误“未定义索引:用户”如何解决?

如何在解决python中的条件时解决python中的位置索引错误?

如何解决线性搜索算法中的索引错误?

Datagridview 错误:: 索引超出范围。我该如何解决?