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

标签 python argparse

我想打印程序的所有选项,并将它们分组以便于阅读。但是,当通过 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/

相关文章:

python - 如何通过单击按钮重新执行我的 Python 程序

javascript - Django Python : Can't access JS object passed via AJAX from Python QueryDict

Python argparse : mutually exclusive arguments with optional and positional argument

Python 参数解析 : both optional and positional value for an argument

python - 如何根据另一个论点使一个论点成为必要的?

python - 使用 Python hidapi 打开具有多种用途的设备

Python GTK - 属性错误 : 'gi.repository.Gtk' object has no attribute 'Stack'

python - Selenium Python webdriver : driver. get() 不接受变量?

python - 如何检查特定的子解析器?

Python:从 optparse 切换到 argparse