Argparse 嵌套子解析器

Argparse nested subparsers

我想使用 python 3 库 argparse 创建嵌套 subparsers。目前我在尝试实施解决方案时收到此错误消息:

AttributeError: 'ArgumentParser' object has no attribute 'add_parser'

这是我正在使用的代码:

def parse_args():
    """
    Parse and validate user command line.
    """
    # Top-level parser
    parser = argparse.ArgumentParser(
        description="foo"
    )

    parser.add_argument(
        "-foo",
        dest="foo",
        help="foo",
        required=True,
        type=str
    )

    subparsers = parser.add_subparsers(help='sub-command help')

    # Parser for the "payload" command
    parser_payload = subparsers.add_parser(
        "payload", 
        help="payload help"
    )

    parser_payload.add_argument(
        "-b",
        "--bar",
        dest="bar",
        help="bar",
        type=str
    )

    # Parser for the "payload->foobar" command
    parser_payload_foobar = parser_payload.add_parser(
        "foobar"
        help="foobar help"
    )

    parser_payload_foobar.add_argument(
        "-bf",
        "--barfoo",
        dest="barfoo",
        help="barfoo",
        type=str
    )

    return parser.parse_args()

你看到这里的规律了吗?

subparsers = parser.add_subparsers(help='sub-command help')
...
parser_payload = subparsers.add_parser(   # ok
...
parser_payload.add_parser(    # error

parser 有一个 add_subparsers 方法。 subparsers 对象(不管是什么)有一个 add_parser 方法。错误消息说 parser 没有那个方法。

如果你想向 parser_payload 添加子解析器,你必须从 add_subparsers 方法开始。

argparse 是围绕 classes 组织的,无论从文档中是否显而易见。每个 class 都有其定义的方法。

我喜欢在交互式环境中进行开发,在这种环境中,我可以在创建对象时检查 class 和对象的属性。