argparse подпарсеры не распознаются - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий тестовый код:

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 голосов
/ 28 ноября 2018

Если вы используете 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')

Если режим является чем-то отдельным, что вы хотите установить в дополнение к выбору подпаратера, вам нужно передать этот аргумент отдельно

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')
...