我想打印该程序的所有选项,并将它们分组以便于阅读。但是,当通过vars(args)
访问参数时,订单是随机的。
答案 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
操作未出现在命名空间中。我可以从显示屏中过滤出那种动作。