有没有办法按照定义它们的顺序获取argparse的参数?

时间:2016-09-01 23:50:25

标签: python argparse

我想打印该程序的所有选项,并将它们分组以便于阅读。但是,当通过vars(args)访问参数时,订单是随机的。

1 个答案:

答案 0 :(得分:2)

argparse解析sys.argv[1:]中的参数列表(sys.argv[0]用作prog中的usage值。

args=parser.parse_args()会返回argparse.Namespace个对象。 vars(args)根据此对象(args.__dict__)返回字典。字典的键是无序的。 print(args)也使用此字典顺序。

解析器会为自己的簿记目的记录看到的操作。但它不会暴露给用户,而且是无序的set。我可以想象定义一个自定义的Action子类,它记录了其实例的使用顺序。

可以在创建解析器时按照定义参数的顺序检索参数。这是因为parser列出了所有_actions的{​​{1}}。它不是公共API的一部分,而是一个基本属性,不太可能每个都消失。

举例说明:

Actions

使用和帮助列表按照定义的顺序显示参数,但In [622]: parser=argparse.ArgumentParser() In [623]: parser.add_argument('foo') In [624]: parser.add_argument('--bar') In [625]: parser.add_argument('--baz') In [626]: parser.print_help() usage: ipython3 [-h] [--bar BAR] [--baz BAZ] foo positional arguments: foo optional arguments: -h, --help show this help message and exit --bar BAR --baz BAZ positionals是分开的。

optionals

在这里,我迭代In [627]: args=parser.parse_args(['--bar','one','foobar']) In [628]: args Out[628]: Namespace(bar='one', baz=None, foo='foobar') In [629]: vars(args) Out[629]: {'bar': 'one', 'baz': None, 'foo': 'foobar'} In [631]: [(action.dest, getattr(args,action.dest, '***')) for action in parser._actions] Out[631]: [('help', '***'), ('foo', 'foobar'), ('bar', 'one'), ('baz', None)] 列表,获取每个_actions的{​​{1}},并从dest命名空间中获取该值。我也可以从Action字典中获取它。

我必须向args提供默认vars(args),因为getattr操作未出现在命名空间中。我可以从显示屏中过滤出那种动作。