列表索引超出范围:使用try例外,结果不同

时间:2019-05-17 14:15:58

标签: python-3.x exception try-except

我正在尝试构建一个看起来像“ scriptName -s arg1 arg2 ... -d ...”的cli解析器。因此,我尝试将-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 :(得分:0)

我建议使用python的argparse模块。它确实做到了这一点,还有更多。 https://docs.python.org/3/library/argparse.html

您可以设置可选参数。布尔参数。 arguments = value就像参数一样,甚至对它们做一些逻辑,例如汇总值。

但是,如果您确实要执行此操作:



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 = []