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]])
我有一个 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]])