Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/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_Python 3.7 - Fatal编程技术网

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

Python argparse-将父解析器参数分组,python,argparse,python-3.7,Python,Argparse,Python 3.7,有没有办法将父解析器中的参数分组到不同的组中?我没有访问父解析器本身的权限,因此无法在那里添加组。(我正在使用谷歌的OAuth2框架) 目前我的代码是: # test.py from argparse import ArgumentParser from oauth2client import tools parser = ArgumentParser(description="My program", parents=[tools.argparser]) parser.add_argumen

有没有办法将父解析器中的参数分组到不同的组中?我没有访问父解析器本身的权限,因此无法在那里添加组。(我正在使用谷歌的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)

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

多亏了@hpaulj和这个问题“

实现这一点的方法取决于argparse的实现细节,正如我可能预期的那样,因此使用argparse的风险自负。但这适用于当前的Python 3.7.0

在将组添加到my own之前,我们可以在父解析器中重命名组:

# 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.

这是通过重命名父解析器中的一个默认组来实现的。这些组存储在
解析器中。_action_groups
,并按顺序排列
['positional arguments','optional arguments']
,因此在将第二个组添加到新的解析器之前,我们将重命名它(这些参数所在的位置)。这也会阻止组被合并。

您是否尝试过添加组?阅读它的文档并尝试一下。这些组的问题是创建组,然后将参数添加到组中,而不是直接添加到解析器中。因此,我需要(以某种方式)将参数从父解析器移动到这个新组中。顺便说一句,没有办法从一个解析器中获取参数并像这样将它们添加到另一个解析器中。我会把它添加到描述中。然后我的链接比我想象的更相关。所有操作都在
解析器中以及一个现有参数组中。有两个默认组。请参阅
解析器。_action_group
。该链接讨论了对组的显示进行重新排序,但是您也可以重命名一个组,并且(我认为)将一个操作从一个组移动到另一个组。这是Python。对象及其属性通常是可访问的,即使它们的名称中有一个
。啊,我现在明白了!谢谢这有一些副作用,但这是意料之中的,因为它没有使用公共属性。如果我能创建一个清晰的示例,我将添加它作为答案。