我有以下测试代码:
import argparse
myparser = argparse.ArgumentParser(prog='test')
myparser.add_argument('mode', choices=['A', 'B'])
subparsers = myparser.add_subparsers()
a_parser = subparsers.add_parser('A')
b_parser = subparsers.add_parser('B')
a_parser.add_argument('frog',action='store')
b_parser.add_argument('toad',action='store')
print(myparser)
try:
args = myparser.parse_args(['A', 'frogname'])
print(args)
except ArgumentError as ae:
print(ae)
当我运行它时,我得到以下信息:
ArgumentParser(prog='test', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
usage: test [-h] {A,B} {A,B} ...
test: error: invalid choice: 'frogname' (choose from 'A', 'B')
我不确定为什么要获得'mode'参数的多个副本,或者为什么我的子解析器将被忽略。
答案 0 :(得分:2)
如果您使用mode
来尝试选择子解析器,则无需这样做。这就是add_parser()
为您服务的一部分。
myparser = argparse.ArgumentParser(prog='test')
# myparser.add_argument('mode', choices=['A', 'B']) # Don't think you need this
subparsers = myparser.add_subparsers()
a_parser = subparsers.add_parser('A')
b_parser = subparsers.add_parser('B')
a_parser.add_argument('frog',action='store')
b_parser.add_argument('toad',action='store')
args = myparser.parse_args(['A', 'frogname'])
print(args)
>>> Namespace(frog='frogname')
如果除了选择子解析器之外还需要设置mode,则需要单独传递该参数
myparser = argparse.ArgumentParser(prog='test')
myparser.add_argument('mode', choices=['A', 'B'])
subparsers = myparser.add_subparsers()
a_parser = subparsers.add_parser('A')
b_parser = subparsers.add_parser('B')
a_parser.add_argument('frog',action='store')
b_parser.add_argument('toad',action='store')
args = myparser.parse_args(['A', 'A', 'frogname'])
print(args)
>>> Namespace(frog='frogname', mode='A')