2016-01-09 2 views
1

У меня проблема, я пытаюсь найти решение. Я не уверен, могу ли я сделать это с помощью argparse.аргумент parsing в python

Я хочу, чтобы иметь возможность указать опцию

myprog -a 1 
myprog -a 2 

Теперь, когда у меня есть а = 1, я хочу, чтобы иметь возможность указать б и с. Но когда a = 2, я могу указать только d.

myprog -a 1 -b 3 -c 0 
myprog -a 2 -d 3 

Также всегда должен быть указан

ответ

1

Вы не можете сделать это с помощью переключаемых значений в качестве одного parse_args вызова, но вы можете сделать один из:

  1. Использование sub-commands/sub-parsers
  2. ли частичный разбор до полного конфигурирования анализатор и работает на полную командной строки, сначала проверяя только на a, а затем выбирая аргументы дополнительного парсера для анализа на основе результата первого вызова. Хитрость заключается в использовании parse_known_args для первого вызова, поэтому он обрабатывает a (который он распознает) и игнорирует все остальное.

Например, для захода на посадку # 2, вы могли бы сделать:

parser = argparse.ArgumentParser() 
parser.add_argument('-a', required=True, type=int, choices=(1, 2) 
args = parser.parse_known_args() 

if args.a == 1: 
    parser.add_argument('-b', ...) 
    parser.add_argument('-c', ...)  
    args = parser.parse_args() 
else: 
    parser.add_argument('-d', ...) 
    args = parser.parse_args() 

Даунсайд этого подхода заключается в том, что информация использование сплюнул за неправильное использование будет неполным; вам нужно будет вручную включить текст, определяющий «реальное» использование в базовом парсере, что не представляет труда. Субпараторы нельзя переключать на основе переключателей значений, но они имеют единый, согласованный дисплей использования.

1

Самое простое решение сделать '-a'required=True аргумент и оставить другие с по умолчанию не-обязательно. Затем после синтаксического анализа выполните тесты на args.a и другие значения (предположим, вы можете написать такую ​​логику Python).

Вы можете создавать свои ошибки или есть возможность звонить по телефону parser.error("I don't like your input").

Вам нужно написать обычную линию usage. Что было бы значимым использованием, учитывая эти требования?

Существует метод mutually exclusive argument group, но он не использует определенные значения, просто наличие или отсутствие аргументов.

Вы также можете включить тесты в пользовательские классы действий. Но обычно это сложнее, чем выполнение тестов после разбора (поскольку argparse обрабатывает аргументы, которые происходят в любом порядке).

Другая возможность преобразования аргумента -a в подпараметр. Это позволяет вам определить один набор аргументов для одного значения «парсер», а другой - для другого значения. Я думаю, что документация argparse достаточно ясна.