【问题标题】:Python argparse - Grouping parent parser arguments into groupsPython argparse - 将父解析器参数分组
【发布时间】:2018-11-16 06:16:52
【问题描述】:

有没有办法将来自父解析器的参数分组到不同的组中?我无权访问父解析器本身,所以我不能在那里添加组。 (我使用的是 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)

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

【问题讨论】:

  • 你试过add_argument_group吗?阅读它的文档并尝试一下。 stackoverflow.com/questions/39047075/…
  • 这些组的问题是您创建了组,然后将参数添加到组,而不是直接添加到解析器。所以我需要(以某种方式)将参数从父解析器移到这个新组中。 AFAIK 没有办法从一个解析器获取参数并将它们添加到另一个解析器。我会把它添加到描述中。
  • 那么我的链接比我想象的更相关。所有操作都在parser 和现有参数组之一中。有 2 个默认组。请参阅parser._action_groups。该链接讨论了重新排序组的显示,但您也可以重命名一个组,并且(我认为)将一个动作从一个组移动到另一个组。这是 Python。对象及其属性通常是可访问的,即使它们的名称中有 _
  • 啊,我明白了!谢谢!这有一些副作用,但这是可以预料的,因为它没有使用公共属性。如果我可以创建一个干净的示例,我会将其添加为答案。

标签: python argparse python-3.7


【解决方案1】:

感谢@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'] 排序,因此我们在将第二个组(即这些参数所在的位置)重命名之前,将其添加到新的解析器中。这也会阻止组被合并。

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2018-12-14
    • 2012-04-25
    • 2017-12-02
    • 2014-03-04
    • 2018-12-31
    • 2011-11-21
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多