首先,子解析器 永远不会 插入名称空间。在您发布的示例中,如果您尝试以以下方式运行脚本:
$python3 test_args.py cmd1 1Namespace(cmd1_option1='1')
其中
test_args.py包含您提供的代码(
import argparse在开头和
print(args)结尾处带有)。
注意,
cmd1仅提及其参数就没有提及。 这是设计使然 。
如注释中所指出的,您可以添加将
dest参数传递给
add_subparsers调用的信息。
处理这些情况的通常方法是使用子
set_defaults解析器的方法:
import argparseparser = argparse.ArgumentParser()subparsers = parser.add_subparsers(help='Functions')parser_1 = subparsers.add_parser('cmd1', help='...')parser_1.add_argument('cmd1_option1', type=str, help='...')parser_1.set_defaults(parser1=True)parser_2 = subparsers.add_parser('cmd2', help='...')parser_2.set_defaults(parser2=True)parser_3 = subparsers.add_parser('cmd3', help='...')parser_3.add_argument('cmd3_options', type=int, help='...')parser_3.set_defaults(parser_3=True)args = parser.parse_args()print(args)结果是:
$python3 test_args.py cmd1 1Namespace(cmd1_option1='1', parser1=True)$python3 test_args.py cmd2Namespace(parser2=True)
通常,大多数情况下,不同的子解析器将以完全不同的方式处理参数。通常的模式是具有不同的功能来运行不同的命令并用于
set_defaults设置
func属性。解析参数时,您只需调用该可调用对象即可:
subparsers = parser.add_subparsers()parser_1 = subparsers.add_parser(...)parser_1.set_default(func=do_command_one)parser_k = subparsers.add_parser(...)parser_k.set_default(func=do_command_k)args = parser.parse_args()if args.func: args.func(args)



