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