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
перечисляет возможные подкоманды (и связанное с ними описание).