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 和对象的属性。
我想使用 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 和对象的属性。