2016-10-11 5 views
1

Я хотел бы иметь требуемый аргумент командной строки, переданный как позиционный аргумент или необязательный аргумент. Например, я хотел бы такое же действие выполняется из любого из следующих вызовов:argparse: пусть тот же требуемый аргумент будет позиционным ИЛИ необязательным

prog 10 
prog -10 
prog -n 10 
prog --num 10 

Возможно ли это с argparse?

ответ

0

С взаимоисключающих группы можно создать разумное приближение:

В интерактивной сессии:

In [10]: parser=argparse.ArgumentParser() 
In [11]: grp=parser.add_mutually_exclusive_group(required=True) 
In [12]: a=grp.add_argument('pos',nargs='?',type=int,default=0) 
In [13]: b=grp.add_argument('-n','--num') 

grp может содержать любое количество, и дополнительными опциями один дополнительный позиционной. Я выбрал другой type для позиционирования, просто выделив разницу.

Просто позиционное значение:

In [14]: parser.parse_args(['10']) 
Out[14]: Namespace(num=None, pos=10) 

Различные формы опциональный:

In [16]: parser.parse_args(['-n10']) 
Out[16]: Namespace(num='10', pos=0) 
In [17]: parser.parse_args(['--num=10']) 
Out[17]: Namespace(num='10', pos=0) 
In [18]: parser.parse_args(['--num','10']) 
Out[18]: Namespace(num='10', pos=0) 

тест группы эксклюзивности

In [25]: parser.parse_args(['--num=20','10']) 
usage: ipython3 [-h] [-n NUM] [pos] 
ipython3: error: argument pos: not allowed with argument -n/--num 

и группы требуется:

In [26]: parser.parse_args([]) 
usage: ipython3 [-h] [-n NUM] [pos] 
ipython3: error: one of the arguments pos -n/--num is required 

Я экспериментировал с предоставлением позиционного же dest в качестве дополнительного - так что оба будут писать до num. Но это приводит к позиционной записи над dest с его по умолчанию (я могу добавить детали, если это необходимо)

In [19]: a.dest 
Out[19]: 'pos' 
In [20]: a.dest='num' 
In [21]: parser.parse_args(['--num','10']) 
Out[21]: Namespace(num=0) 

Сообщение разбора кода будет обрабатывать значения args.pos и args.num в том, что когда-либо образом имеет смысл.

Вход '-10 'не под рукой. Ну, я мог бы определить:

parser.add_argument('-1') 

но результат, вероятно, не то, что вы хотите:

In [31]: parser.parse_args(['--num=20','-12']) 
Out[31]: Namespace(1='2', num='20', pos=0) 

В целом это требование делает вещи излишне трудным для вас программист.

+0

Спасибо за ваш ответ. Я согласен с вами в отношении бесполезности формы '-10'. Я думал о команде «хвост» UNIX, когда я писал, но это очень специфичное использование, и в конце концов это не стоит дополнительного кодирования. Я считал использование взаимоисключающей группы, как вы предполагали, но мне кажется, что это способ обойти философию «argparse» (которой я не слишком люблю) четкого различия между позиционными и необязательными аргументами , В конце концов, если я решаю сохранить 'argparse', я думаю, что я буду использовать только необязательную форму аргумента (' -n', '--num'). – beppe