首页 > 解决方案 > 修改现有的 argparse 解析器 - 具体来说,删除位置

问题描述

对于我来说,编写命令行程序是很常见的,这些程序依赖于另一个已经定义的处理,并对行为进行了一些调整。

当需要添加参数时,我可能会执行以下操作:

@classmethod
def modify_parser(cls, parser):
    dest="node"
    default="root"
    parser.add_argument(
        "--" + dest,
        action="store",
        help="%s node to list[%s]" % (dest,default)
        )

我不是在编写子命令,我只是在现有解析器中添加一个选项。工作正常。

好的,但是假设我想删除一个选项。让我们看看下面的 argparse 帮助信息:

usage: test_dumper3.py [-h] 
                       [--Database DBNAME]
                       config [recname [recname ...]]

dump out tables

positional arguments:
  config                config file   <<<< I DONT WANT THIS!
  recname                             <<<< because this replaces it
....

这是我的第一次尝试:

@classmethod
def modify_parser(cls, parser):

    dest="recname"
    parser.add_argument(
        dest,
        nargs="*",
        action="store",
        help=dest
        )
    parser._positionals._remove_action("config")

我明白了ValueError('list.remove(x): x not in list',)

我猜你需要传入 argparse.Action 实例来删除,而不是它的名称。有什么地方可以查到吗?像action_to_delete = parser.get_action('config')然后parser._positionals._remove_action(action_to_delete)

我真的不介意与_私有属性相关的风险,只是尝试使用 argparse。

标签: pythonargparse

解决方案


推荐阅读