2013-06-06 3 views
5

Я хотел бы сделать синтаксический анализатор как cmd [-a xxx -b xxx] -c xxx -d xxxargparse два аргумента зависит друг от друга

Когда -a используются, я хочу -b быть использован также. Аналогично, если используется -b, то необходимо использовать -a. Все нормально -a и -b не используются.

Как это сделать? Я пробовал пользовательские действия, но это не так.

ответ

9

Argparse не поддерживает этот тип использования.

Наиболее эффективное, что нужно сделать, это проверить и посмотреть, если эти типы условий выполняются после синтаксического анализа:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-b') 
parser.add_argument('-c') 

args = parser.parse_args() 

required_together = ('b','c') 

# args.b will be None if b is not provided 
if not all([getattr(args,x) for x in required_together]): 
    raise RuntimeError("Cannot supply -c without -b") 
+0

Спасибо за решение. – timchen

10

Лучше дизайна будет иметь один параметр, который принимает два аргумента:

parser.add_argument('-a', nargs=2) 

Затем вы либо указываете опцию с двумя аргументами, либо не указываете ее вообще.

$ script -a 1 2 

или

$ script 

пользовательское действие (или постобработка) можно разделить кортеж args.a на два отдельных значений args.a и args.b.

+0

Спасибо, это хорошая идея, я, наконец, использовал nargs = 2 в своей программе. – timchen

+1

Это действительно 'nargs' не' narg', но я не могу отредактировать ответ, потому что это всего лишь 1 char – Leonardo

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