Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法按照argparse的定义顺序获取参数?_Python_Argparse - Fatal编程技术网

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

Python 有没有办法按照argparse的定义顺序获取参数?,python,argparse,Python,Argparse,我想打印程序的所有选项,并将它们分组以便于阅读。但是,通过vars(args)访问参数时,顺序是随机的。argparse解析sys.argv[1://code>中的参数列表(sys.argv[0]用作用法中的prog值) args=parser.parse_args()返回一个argparse.Namespace对象vars(args)返回基于此对象的字典(args.\uuuu dict\uuu)。字典的键是无序的打印(args)也使用此字典顺序 解析器保存所看到的动作的记录,以用于自己的簿记目

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

argparse
解析
sys.argv[1://code>中的参数列表(
sys.argv[0]
用作
用法中的
prog
值)

args=parser.parse_args()
返回一个
argparse.Namespace
对象
vars(args)
返回基于此对象的字典(
args.\uuuu dict\uuu
)。字典的键是无序的<代码>打印(args)
也使用此字典顺序

解析器保存所看到的动作的记录,以用于自己的簿记目的。但是它不向用户公开,并且是一个无序的
集合
。我可以想象定义一个自定义的
Action
子类来记录其实例的使用顺序


可以按照创建解析器时定义的顺序检索参数。这是因为
解析器
有一个所有
操作的
\u actions
列表。它不是公共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
用法和帮助列表按定义的顺序显示参数,但
位置
选项
是分开的

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)]
在这里,我迭代
\u actions
列表,为每个
Action
获取
dest
,并从
args
命名空间中获取该值。我也可以从
vars(args)
字典中获取它


我必须给
getattr
一个默认值
***
,因为
帮助
操作没有出现在名称空间中。我本可以从显示器上过滤掉这类操作。

考虑到argparse和其他类似的东西都是为了符合POSIX标准而设计的,它们指定的顺序并不重要,我真的怀疑它。您可能可以使用
sys.argv
来执行此操作,但是它们不会被解析。您是否对命令行中参数的显示顺序感兴趣,或者对使用
add_argument
创建参数的顺序感兴趣?