在我编写的 IRC 机器人中,我有两个函数可以检索发送消息的用户和已发送的消息。它通过将发送给机器人的读取缓冲区行分成两部分来实现这一点,然后使用第二个列表索引来检索用户/消息。这是代码的第一部分:
def getUser(line):
if "!" in line:
separate = line.split(":", 2)
user = separate[1].split("!", 1)[0]
return user
else:
print "Nothing to receive from the server!"
def getMessage(line):
if ':' in line:
separate = line.split(":", 2)
message = separate[2]
return message
else:
print "Nothing to receive from the server!"
如您所见,我试图形成一种方法来阻止自身在没有从服务器接收到任何内容时从服务器超时;这就是问题的根源。它会检索一行空行,然后尝试拆分空行,然后它尝试访问超出范围的列表索引。我有一个想法,这可以使用 try/catch
语句来完成,但是我是 Python 的新手,对此知之甚少。以下是访问函数的其余代码,如果有帮助的话:
readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer, "\n")
readbuffer = temp.pop()
for line in temp:
user = getUser(line)
message = getMessage(line)
我在行 message = getMessage(line)
和 user = getUser(line)
上收到列表索引错误。
最佳答案
我认为您的问题出在这些行中(可能除了不检查行
是否为空字符串,如gariepy的回答所示):
separate = line.split(":", 2)
user = separate[1].split("!", 1)[0]
和
separate = line.split(":", 2)
message = separate[2]
在第一种情况下,您假设 separate
至少有 2 个元素(因为您在 separate[1]
上使用了 split
) ,在第二种情况下,您假设 separate
至少有 3 个元素(因为您在 separate[2]
上使用 split
)。在访问这些索引之前,您应该先检查它们的长度,如下所示:
separate = line.split(":", 2)
if len(separate) >= 2:
user = separate[1].split("!", 1)[0]
和
separate = line.split(":", 2)
if len(separate) >= 3:
message = separate[2]
此外,请记住在对其应用拆分之前检查 line
是否为非空字符串,如其他答案所示。希望对您有所帮助。
关于python - 每 20 分钟左右列出一次超出范围的索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858419/