Индекс списка вне диапазона: использование try кроме дает другой результат

Я пытаюсь создать Cli-анализатор, где он выглядит как «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 ответ


Я бы порекомендовал использовать модуль 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 = [] 

Есть идеи?

10000