Подтвердить что ты не робот

Как правильно использовать подпараметры argparse?

Я искал выделение примеров подпарамера здесь и вообще, но, похоже, не могу представить эту простую вещь.

У меня есть два типа var, у которых есть ограничения, поэтому мысль о том, что подпункт был таким способом. например -t допускает либо "A" , либо "B" . Если пользователь передает "A" , тогда дополнительно требуется указать, является ли он "a1" или "a2". Если они передают только "B" , тогда ничего.

Могу ли я сделать это и попросить argparse вернуть мне, какой тип "A" был пройден или если он был просто "B" ?

Ниже показано, что работает, но по какой-то причине ломается при передаче чего-либо после субпарадра.

например. с терминала linux

>> python test01.py -t A a1 -v 61

ошибки с...

usage: test01.py a1 [-h]
test01.py a1: error: unrecognized arguments: -v

Надеюсь, это имеет смысл.

Код:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')

parser.add_argument("-t",
                    choices = ["A", "B"],
                    dest = "type",
                    required=True,
                    action='store',
                    help="Some help blah blah")

cam_parser = subparsers.add_parser('a1', help='Default')
cam_parser.set_defaults(which='a1')

cam_parser = subparsers.add_parser('a2', help='parse this instead of default')
cam_parser.set_defaults(which='a2')


parser.add_argument("-v",
                    nargs = '+',
                    required=True,
                    dest = "version",
                    type=int,
                    action='store',
                    help="some version help blah blah")   

argument = parser.parse_args()

print argument.type
print argument.version
4b9b3361

Ответ 1

Подпарамеры вызывается на основе значения первого позиционного аргумента, поэтому ваш вызов будет выглядеть как

python test01.py A a1 -v 61

"A" запускает соответствующий подпараметр, который будет определен для разрешения позиционного аргумента и параметра -v.

Потому что argparse иначе не накладывает никаких ограничений на порядок, в котором могут появляться аргументы и параметры, и нет простого способа изменить, какие аргументы/параметры могут появиться после начала разбора (что-то связано с пользовательскими действиями, которые изменяют экземпляр парсера может работать), вы должны рассмотреть возможность замены -t:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')
parser.add_argument("-v", ...)

a_parser = subparsers.add_parser("A")
b_parser = subparsers.add_parser("B")

a_parser.add_argument("something", choices=['a1', 'a2'])

Так как -v определяется для основного синтаксического анализатора, он должен быть указан перед аргументом, который указывает, какой субпараметр используется для остальных аргументов.