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

Python argparse for infinite number of inputs and flag requiring multiple arguments?

我有一个 Python 图书馆,目前 运行 用户通过

python main.py

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

我的问题是,这个软件的用户应该能够输入(理论上)无限数量的"events",用户需要具体4条信息:"category"(字符串) 、"type"(字符串)、"start_time"(整数)和 "end_time"(整数)。默认情况下,如果没有任何标志,则没有 "events" 是计划,并且程序默认为 运行s。用户必须为每个 "event" 同时给出 4 个参数中的每一个,否则会出现错误消息。用户应该能够根据需要安排尽可能多的 "events"。

目前,我不确定允许用户使用 argparse 传递参数变量的最佳方式,其中 (1) 他们可以一次传递几十个参数,并且 (2)需要 4 个类别。这可能吗?使用的数据结构是什么,通过 argparse 的字典?

对于只有一个这样的输入,天真的方法可能是使用 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 标志来处理多个输入?

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 个项目的新列表。 Post 解析代码可以遍历 args.event 的子列表并将最后 2 个元素转换为整数。

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

对于许多这样的 'events',您可以将它们放在 @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 字符串也是一种选择。带有 type=json.loads 参数的 argparse 参数可以从输入或 @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]])