Python argparse用于无限数量的输入和需要多个参数的标志?

时间:2017-09-09 19:56:08

标签: python argparse software-design

我有一个用户当前通过

运行的Python库
python main.py

main.py将调用同一目录中的其他*.py脚本,程序将运行完成。

我的问题是,这个软件的用户应该能够输入(理论上)无数个“事件”,用户需要特定的4条信息:“类别”(字符串),“类型”(字符串) ),“start_time”(整数)和“end_time”(整数)。默认情况下,如果没有使用任何标志,则不会安排任何“事件”,并且程序默认运行。用户必须为每个“事件”一次给出4个参数中的每一个,否则会出现错误消息。用户应该能够根据需要安排尽可能多的“事件”。

目前,我不确定允许用户使用argparse传递参数变量的最佳方法,其中(1)他们可以同时传递数十个参数和(2)4个类别是必要的。这可能吗?什么是使用的数据结构,通过argparse的dicitionary?

对于只有一个这样的输入,天真的方法可能是使用argparse,并强制用户使用以下格式

python main.py --- user_specify“category1”,1233,1452,1673

main.py脚本中,我有类似

的内容
 import argparse
 parser = argparse.ArgumentParser()
 parser.add_argument("user_specify", action="store_true", default=False)

这很笨拙。更大的问题是它没有解决允许用户传递数十个这样的参数的问题。

正确的pythonic方法是什么?

是否可以通过词典?如何使用相同的argparse标志进行多个输入?

1 个答案:

答案 0 :(得分:2)

In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: parser.add_argument('-e','--event',action='append',nargs=4)

In [5]: args = parser.parse_args('--event cetegory1 123 2 4 -e cat2 23 4 343'.split())
In [6]: args
Out[6]: Namespace(event=[['cetegory1', '123', '2', '4'], ['cat2', '23', '4', '343']])

每个--event标记标记一个包含4个项目的新列表。解析后代码可以遍历args.event的子列表,并将最后2个元素转换为整数。

如果引用,字符串也可以包含空格。

对于许多此类事件'您可以按照

中的说明将它们放入@file

https://docs.python.org/3/library/argparse.html#fromfile-prefix-chars

如果在https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.convert_arg_line_to_args

中使用这个想法

该文件可能看起来像

--event cetegory1 123 2 4 
-e "cat 2" 23 4 343
--event foo bar 4 2
...

这样的数据也可以作为csv文件读取。解析json字符串也是一种选择。带argparse参数的type=json.loads参数可以从输入或@file读取此类字符串。

In [7]: import json
In [8]: parser.add_argument('-j',type=json.loads)
In [9]: argv = ['-j', '[["category1","123",3,4]]']
In [10]: parser.parse_args(argv)
Out[10]: Namespace(event=None, j=[['category1', '123', 3, 4]])