list index out of range:using try except 给出不同的 result:Command 行解析器

list index out of range:using try except gives a different result:Command line parser

我正在尝试构建一个看起来像 "scriptName -s arg1 arg2 ... -d ..." 的 cli 解析器。所以我试图将 -s 之后的所有数据附加到列表中(最后附加到字典中)并 return 它。

以下是我使用的函数:

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']}

有没有更好的方法来解决这个问题,或者有更好的模块来处理命令行参数? 提前致谢。

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

您可以设置可选参数。布尔参数。 argument=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 = []