python - Python argparse - 将父解析器参数分组
问题描述
有没有办法将来自父解析器的参数分组到不同的组中?我无权访问父解析器本身,所以我不能在那里添加组。(我正在使用 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)
但是我找不到一种方法来列出这样的论点或将它们从一个地方复制到另一个地方。
解决方案
感谢@hpaulj 和问题“重新排序 Python argparse 参数组”
执行此操作的方法取决于 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']
的所以我们在将第二个(这是这些参数所在的位置)重命名之前将它添加到新的解析器。这也阻止了组被合并。
推荐阅读
- node.js - 使用 mongoose 和 node express 查找一个集合中的所有文档,更改数据并保存到另一个集合中
- javascript - 传单从地图单击创建标记并访问拖动事件的结束
- javascript - 在嵌套对象中查找任何错误值的更好的 vanilla JS 方法?
- r - 通过添加 0 和 1 的新列,为 R 中列中的值或因子的第一个实例返回 1,为所有其他后续实例返回 0
- typescript - 如何在我的 Typescript Vue 组件中启用 chrome 类型的自动完成功能?
- woocommerce - Woocommerce:将“字段描述”移动到“标签”下方的挂钩?
- scalardl - Bastion 服务器的全局 IP 地址更改后,我需要做什么吗?
- datetime - 是否有关于 UTC 时间与本地时间的偏移量的约定?
- sql - 面对 SQL 中的“Cote d'Ivoire”等值时,如何返回结果?
- c++ - gcc:在 AMD 上启用 AVX