我有一个用户当前通过
运行的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标志进行多个输入?
答案 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]])