Argparse: возможно ли сделать справку контекстно-зависимой

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

например

prog --mode=1 OPTA OPTB OPTC<br>
prog --mode=2 OPTD OPTE OPTF<br>

prog --mode=1 -h<br>
"In mode 1 you have four options, A,B,C,D"

prog --mode=2 -h<br>
"You mode 2 you have four options, D,E,F,G"

Я должен добавить здесь, что это только пример. В моей реальной программе может быть любое количество режимов, и они не определяются моим кодом, а определяются пользователями моего API. Поэтому невозможно жестко закодировать помощь для каждого режима. Фактический текст помощи определяется позже.

Это означает изменение строк справки для аргумента 'option', чтобы отразить различные режимы после обработки аргумента --mode. Приведенный ниже код в основном работает в том смысле, что команда работает должным образом, но справка - нет.

Проблема в том, что parse_known_args(), кажется, обрабатывает -h, а затем завершается. я нуждаюсь parse_args() обращаться за помощью. Очевидно, я мог бы просто разобрать sys.argv и найти --mode сам, но наверняка это побеждает объект argparse,

import argparse

parser = argparse.ArgumentParser(description='Test argparser')
parser.add_argument('--mode', nargs=1, type=int,
                    default=[1],
                   help='program mode')

options={
    1:["OPTA","OPTB","OPTC","OPTD"],
    2:["OPTD","OPTE","OPTF","OPTG"]}


args = parser.parse_known_args()[0]

print "Initial pass"
print args

parser.add_argument('options', type=str, nargs='+',
                    choices=options[args.mode[0]]+["ALL"],
                    default="ALL",
                   help='One or more of the options, above')

args = parser.parse_args()

print "Second pass"
print args

1 ответ

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

prog --mode=1 OPTA OPTB OPTC

станет

prog mode1 OPTA OPTB OPTC

mode1 подкоманде можно дать свою помощь; доступ к нему осуществляется с

prog mode1 -h

Еще одним преимуществом этого подхода является то, что prog -h перечисляет возможные подкоманды (и связанное с ними описание).

Другие вопросы по тегам