无法识别argparse次解析器

时间:2018-11-28 16:36:26

标签: python python-3.x argparse

我有以下测试代码:

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'参数的多个副本,或者为什么我的子解析器将被忽略。

1 个答案:

答案 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')