我想打印程序的所有选项,并将它们分组以便于阅读。但是,当通过 vars(args)
访问参数时,顺序是随机的。
最佳答案
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
所有的列表Actions
。它不是公共(public) API 的一部分,而是一个基本属性,不太可能消失。
举例说明:
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
列表,得到dest
对于每个 Action
,并从 args
获取该值命名空间。我可以从 vars(args)
获取它字典也一样。
我必须给出getattr
默认***
,因为help
操作不会出现在命名空间中。我本可以将此类操作从显示中过滤掉。
关于python - 有没有办法按照定义的顺序获取 argparse 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39282429/