Python 3 - IndexError: строковый индекс вне диапазона - PullRequest
0 голосов
/ 09 июня 2018

В настоящее время я создаю язык программирования на Python 3.6 и по какой-то причине следующий код выдает IndexError: string index out of range.

Когда я пытаюсь выполнить следующий код в пакетном файле Windows:

@echo off
python run-file.py test.ros
pause

Но я получаю следующий вывод:

Traceback (most recent call last):
  File "run-file.py", line 16, in <module>
    if not(value[1][0] == "!") and ignoreline == False:
IndexError: string index out of range
Press any key to continue . . .

Файл run-file.py выглядит так:

from sys import argv as args
from sys import exit as quit
import syntax

try:
    args[1]
except IndexError:
    print("ERROR: No ROS Code file provided in execution arguments")
    print("Ensure the execution code looks something like this: python run-file.py test.ros")

with open(args[1]) as f:
    ignoreline = False
    content = f.readlines()
    content = [x.strip() for x in content]
    for value in enumerate(content):
        if not(value[1][0] == "!") and ignoreline == False:
            firstpart = value[1].split(".")[0]
            lenoffirstpart = len(value[1].split(".")[0])
            afterpart = str(value[1][lenoffirstpart + 1:])
            apwithcomma = afterpart.replace(".", "', '")
            preprint = str(firstpart + "(" + apwithcomma + ")")
            printtext = preprint.replace("(", "('")
            lastprinttext = printtext.replace(")", "')")
            try:
                exec(str("syntax." + lastprinttext))
            except Exception as e:
                template = "ERROR: An error of type {0} occured while running line {1} because {2}"
                message = template.format(
                    type(e).__name__, str(value[0] + 1), str(e.args[0]))
                print(message)
                quit(1)
        elif content[value[0]][0] == "!!!":
            ignoreline = not(ignoreline)

quit(0)

Файл syntax.py выглядит следующим образомэто:

def print_message(contents=''):
    print(contents)

Файл test.ros выглядит следующим образом:

! This is a single line comment

!!!
This line should be ignored
and this one as well
!!!

print_message.Hello World

Похоже, что проблема в строке 16 файла run-file.py:

if not(value[1][0] == "!") and ignoreline == False:

Я уже пытался заменить value[1][0] на (value[1])[0] и другие комбинации скобками, но безрезультатно.

Кажется, что когда я пытаюсь напечатать значение, оно ведет себя как ожидалось и дает мне !, который является первым символом файла test.ros, но по какой-то причине он выдает исключение, когда он находится вif Statement.

Если вы хотите больше источника, он находится на Github, и вы можете найти точный коммит, содержащий все файлы здесь

Обновление / Решение

Большое спасибо Иданмель и Клаус Д. за помощь в решении моей проблемы.Вы можете просмотреть сделанные мной изменения здесь

1 Ответ

0 голосов
/ 09 июня 2018

Это происходит потому, что 2-я строка в test.ros пуста.

В этом примере вы создаете содержимое:

['! This is a single line comment',
 '',
 '!!!',
 'This line should be ignored',
 'and this one as well',
 '!!!',
 '',
 'print_message.Hello World']

Когда вы пытаетесь получить доступ к содержимому [1] [0], вы получаете IndexError, потому что это пустая строка.

Попробуйте удалить пустые строки из содержимого, добавив выражение if в список:

content = [x.strip() for x in content if x.strip()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...