Python argparse-将父解析器参数分组

时间:2018-11-15 20:00:06

标签: python argparse python-3.7

是否可以将父解析器中的参数分为不同的组?我无权访问父解析器本身,因此无法在其中添加组。 (我正在使用Google的OAuth2框架。)

当前我的代码是:

# test.py
from argparse import ArgumentParser
from oauth2client import tools

parser = ArgumentParser(description="My program", parents=[tools.argparser])
parser.add_argument("--foo", help="Foo the data")
parser.add_argument("--bar", help="Bar the data")

parser.parse_args()

哪个会产生以下帮助:

$ python test.py -h                                    
usage: test.py [-h] [--auth_host_name AUTH_HOST_NAME]
               [--noauth_local_webserver]
               [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
               [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
               [--foo FOO] [--bar BAR]

My program

optional arguments:
  -h, --help            show this help message and exit
  --auth_host_name AUTH_HOST_NAME
                        Hostname when running a local web server.
  --noauth_local_webserver
                        Do not run a local web server.
  --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
                        Port web server should listen on.
  --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Set the logging level of detail.
  --foo FOO             Foo the data
  --bar BAR             Bar the data

因此,我想为父解析器的参数创建一个组。可以对参数进行分组以使其看起来像这样吗?

optional arguments:
  -h, --help            show this help message and exit
  --foo FOO             Foo the data
  --bar BAR             Bar the data

authentication options:
  --auth_host_name AUTH_HOST_NAME
                        Hostname when running a local web server.
  --noauth_local_webserver
                        Do not run a local web server.
  --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
                        Port web server should listen on.
  --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Set the logging level of detail.

我了解解析器组,但是我需要以某种方式将参数从一个地方转移到另一个地方,例如:

auth_group = parser.add_argument_group('authentication options')
for arg in get_args_from_parser(tools.argparser):
    auth_group.add_argument(arg)

但是我找不到一种列出类似参数或将它们从一个地方复制到另一个地方的方法。

1 个答案:

答案 0 :(得分:0)

感谢@hpaulj和问题“ Reorder Python argparse argument groups

执行此操作的方法取决于argparse的实现细节,正如我可能应该期望的那样,因此使用此方法后果自负。但这适用于当前的Python 3.7.0。

在将其添加到我自己的解析器之前,我们可以在父解析器中重命名该组:

# test.py
from argparse import ArgumentParser
from oauth2client import tools

tools.argparser._action_groups[1].title = 'authentication options'

parser = ArgumentParser(description="My program", parents=[tools.argparser])
parser.add_argument("--foo", help="Foo the data")
parser.add_argument("--bar", help="Bar the data")

parser.parse_args()

输出结果:

$ python test.py -h                                    
usage: test.py [-h] [--auth_host_name AUTH_HOST_NAME]
               [--noauth_local_webserver]
               [--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]
               [--logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
               [--foo FOO] [--bar BAR]

My program

optional arguments:
  -h, --help            show this help message and exit
  --foo FOO             Foo the data
  --bar BAR             Bar the data

authentication options:
  --auth_host_name AUTH_HOST_NAME
                        Hostname when running a local web server.
  --noauth_local_webserver
                        Do not run a local web server.
  --auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]
                        Port web server should listen on.
  --logging_level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Set the logging level of detail.

这通过重命名父解析器中的默认组之一来工作。这些组存储在parser._action_groups中,并按顺序['positional arguments', 'optional arguments']进行排序,因此在将第二个组添加到新的解析器之前,我们要对其进行重命名。这也阻止了组的合并。