Индекс списка вне диапазона: использование try кроме дает другой результат - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать синтаксический анализатор, где он выглядит как "scriptName -s arg1 arg2 ... -d ...".Поэтому я пытаюсь добавить все данные после -s в список (и, наконец, в словарь) и вернуть его.

Следующая функция, которую я использую:

def split_data(cli_args):
   dict_args = {}
   local_list = []
   for i in range(1,len(cli_args)):
        if(cli_args[i] == '-s'):
            try:
                i = i + 1
                while(cli_args[i] != '-d'):
                    print("while",(cli_args[i]))
                    local_list.append(cli_args[i])
                    i = i + 1
                    print("local_list",local_list)
                dict_args.update({"options" : local_list})
            except BaseException as err:
                print(str(err))
                break
    print(dict_args)
    return dict_args

Результат дает:

while arg1
local_list ['arg1']
while arg2
local_list ['arg1', 'arg2']
list index out of range
{}

Но если вам нужно было обернуть цикл while (полный цикл) в try: except:pass, то в конечном словаре сохраняются данные, почему?

while arg1
local_list ['arg1']
while arg2
local_list ['arg1', 'arg2']
list index out of range
{"options" : ['arg1', 'arg2']}

1 Ответ

0 голосов
/ 17 мая 2019

Я бы порекомендовал использовать модуль argparse в python. Это делает именно это и многое другое. https://docs.python.org/3/library/argparse.html.

Вы можете установить необязательные аргументы. Булевы аргументы. аргумент = значение подобно аргументам и даже делает некоторую логику для них, например, для агрегирования значений.

Однако, если вы действительно хотите это сделать:



listargs = False
dict_args = {}
lst = []
for i in cli_args:
    if i == "-d":
        listargs = True
    if listargs:
        lst.append(i)
    if i == "-s":
        listargs = False
        dict_args["options"] = lst
        lst = []
...