要延迟获取选择,您可以分两个阶段解析命令行:在第一阶段,您仅找到子解析器,在第二阶段,子解析器用于解析其余参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('subparser', choices=['foo','bar'])
def foo_parser():
parser = argparse.ArgumentParser()
parser.add_argument('fooval', choices='123')
return parser
def bar_parser():
parser = argparse.ArgumentParser()
parser.add_argument('barval', choices='ABC')
return parser
dispatch = {'foo':foo_parser, 'bar':bar_parser}
args, unknown = parser.parse_known_args()
args = dispatch[args.subparser]().parse_args(unknown)
print(args)
它可以这样使用:
% script.py foo 2
Namespace(fooval='2')
% script.py bar A
Namespace(barval='A')
请注意,顶级帮助消息将不太友好,因为它只能告诉您有关子解析器选择的信息:
% script.py -h
usage: script.py [-h] {foo,bar}
...
要查找有关每个子解析器中的选择的信息,用户必须选择子解析器并传递-h
to it:
% script.py bar -- -h
usage: script.py [-h] {A,B,C}
之后的所有参数--
被认为是非选项(script.py
)并因此被解析为bar_parser
.