2015-10-11 1 views
0

Я намерен дать разные варианты поведения, которые не связаны друг с другом, если -r is предоставляется или не предоставляется. Итак, если присутствует аргумент -r, это займет два и только два. Если нет, он будет есть все заданные аргументы. С помощью этой установки:Argparse официальный способ отключения другой опции, если выбрана одна опция

parser = ArgumentParser(prog='frog') 
parser.add_argument('integer', 
        metavar='integer(s)', 
        type=int, 
        nargs='*') 
parser.add_argument('-r', '--range', 
        metavar=('start', 'end'), 
        type=int, 
        nargs=2) 

, если я называю:

frog -r 123 1231 121 
# this will give Namespace(integer=[123], range=[1231, 121]) 

, если я изменю nargs для integer к *, а затем вызвать:

frog -r 123 1231 
# complaints about 'integer' that is required 

Конечно, это не слишком сложно создайте простые проверки args. Но, на мой вопрос, есть argparse имеет официальный способ отключить один параметр, если активирован другой?

ответ

1

if I change nargs for integer to *, and then call: - думаю, вы имеете в виду, change nargs for integer to +. В вашем примере это уже *.

С «+», integer ожидает найти хотя бы один аргумент. Если ничего не осталось от -r, тогда он собирается жаловаться.

Основная философия argparse - обрабатывать каждый аргумент независимо. Он также пытается быть независимым от заказа, поэтому frog 123 -r 1231 32 будет работать так же хорошо, как и frog -r 1231 32 123.

Можно заставить взаимодействие между аргументами с пользовательскими классами Action, но это имеет тенденцию разрушать независимость порядка.

Обычно лучше всего написать аргументы, чтобы принять самую общую ситуацию, и выполнить свою собственную проверку впоследствии. Таким образом, я бы придерживался * и объект, если args.integer - неправильное количество значений.

Основная цель argparse - выяснить, чего хочет пользователь - это синтаксический анализатор. Вы всегда можете ругать их потом.

Смежные вопросы