当前位置: 首页 > 面试题库 >

Python argparse-向多个子解析器添加参数

沈伟
2023-03-14
问题内容

我的脚本定义了一个主解析器和多个子解析器。我想将-p论点应用于一些子解析器。到目前为止,代码如下所示:

parser = argparse.ArgumentParser(prog="myProg")
subparsers = parser.add_subparsers(title="actions")

parser.add_argument("-v", "--verbose",
                    action="store_true",
                    dest="VERBOSE",
                    help="run in verbose mode")

parser_create = subparsers.add_parser ("create", 
                                        help = "create the orbix environment")
parser_create.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

# Update
parser_update = subparsers.add_parser ("update", 
                                        help = "update the orbix environment")
parser_update.add_argument ("-p", 
                            type = int, 
                            required = True, 
                            help = "set db parameter")

如您所见,add_arument ("-p")重复了两次。实际上,我还有更多的次级解析器。有没有一种方法可以遍历现有的子解析器以避免重复?

作为记录,我正在使用Python 2.7


问题答案:

这可以通过定义一个包含公共选项的父解析器来实现:

import argparse

parent_parser = argparse.ArgumentParser(description="The parent parser")
parent_parser.add_argument("-p", type=int, required=True,
                           help="set db parameter")
subparsers = parent_parser.add_subparsers(title="actions")
parser_create = subparsers.add_parser("create", parents=[parent_parser],
                                      add_help=False,
                                      description="The create parser",
                                      help="create the orbix environment")
parser_create.add_argument("--name", help="name of the environment")
parser_update = subparsers.add_parser("update", parents=[parent_parser],
                                      add_help=False,
                                      description="The update parser",
                                      help="update the orbix environment")

这将生成以下格式的帮助消息:

parent_parser.print_help()

输出:

usage: main.py [-h] -p P {create,update} ...
The parent parser
optional arguments:
  -h, --help       show this help message and exit
  -p P             set db parameter
actions:
  {create,update}
    create         create the orbix environment
    update         update the orbix environment



parser_create.print_help()

输出:

usage: main.py create [-h] -p P [--name NAME] {create,update} ...
The create parser
optional arguments:
  -h, --help       show this help message and exit
  -p P             set db parameter
  --name NAME      name of the environment
actions:
  {create,update}
    create         create the orbix environment
    update         update the orbix environment

但是,如果您运行程序,则如果未指定操作(即createupdate),则不会遇到错误。如果您希望这种行为,请按如下所示修改您的代码。

<...>
subparsers = parent_parser.add_subparsers(title="actions")
subparsers.required = True
subparsers.dest = 'command'
<...>

由@hpaulj更新

由于自2011年以来处理次解析器的变化,将主解析器用作并不是一个好主意parent。更一般而言,不要尝试dest在主解析器和子解析器中定义相同的参数(相同)。子解析器的值将覆盖主设置的所有内容(即使子解析器default也可以这样做)。创建单独的解析器以用作parents。并且如文档中所示,父母应使用add_help=False



 类似资料:
  • 问题内容: 数据结构蓝图: 使用Newtonsoft.Json,我具有以下用于Json序列化的配置。 显然,这将打印出: 现在,我需要在JsonSerializerSettings中的ContractResolver中添加另一个NullToEmptyStringResolver,如何实现如下输出: 请注意,我的NullToEmptyStringResolver已被编写。但是我需要将NullToEm

  • 我正在做一个项目,以创建一个超过2个子节点的树。我明白在创建二叉树时,我们可以只创建一个左节点和一个右节点来充当子节点,但当我在网上寻找创建树的帮助时,我找到的每一个解决方案都谈到了创建二叉树。我明白创建树的部分意味着您需要创建子节点数组或arraylist,但我不明白如何将数据放入数组,或者如何将子节点数组“连接”到父节点? 这是我目前掌握的代码。我知道这不是很多,但我正在努力刚刚开始这个项目。

  • 问题内容: 是否可以在向其添加一些参数数据的同时将请求转发给另一个控制器?我尝试添加到ModelMap中,但是它似乎不存在问题。我正在做类似的事情: 我能想到的唯一其他方法是将参数放在会话上,然后将其弹出目标控制器。 问题答案: 最简单的方法是将数据添加到请求中。 由于这是转发,因此将相同的请求传递到服务器内的不同处理程序。 作为示例,让我们从两个控制器的简单设置开始,一个转发到另一个: 添加数据

  • 首先,我不确定这是不是实现我想要的东西的正确方法..我正在尝试将如下所示的导出绑定添加到router . navigate()-方法: 问题是我从不使用该指令,而是通过路由器来处理: 我如何实现相同的导出绑定从第一个例子中的接受呼叫()-方法?我已经添加了一个输入()变量,并尝试使用queryParams,如下所示: 但这并不起作用。

  • 目标 为API中发出的每个请求包含多个安全标头 问题 我正在尝试将多个标头添加到我的Swagger YAML安全定义中。我已经搜索了API,但运气不佳,但我发现在进行“尝试此操作”时,我需要选择一个。而不是两者都能使用。这是正确的还是我做了什么不正确的事情? 片段 另类? 如果我试图做到这一点,这是不可能的……是否可以将这些参数指定为swagger文档中所有rest路径的默认值? 我是本周Swag

  • 我正在使用 iReport 4.0.2 创建一个包含一个子报表的主报表。我尝试在子报表的页眉带和页脚带中添加一些静态文本,我希望页眉带和页脚带中的文本将重复,但如果子报表本身有多个页面,则这些文本仅显示在子报表的第一页(但不显示在其余页面上)。 实际上,我想做的是在子报表中放置一个“第 x 页,共 n 页”变量,以便子报表可以有自己的一组页码。 这是我当前报告的布局:(对不起,我没有权限在这里上传