2013-05-27 5 views
7

Я пытаюсь иметь взаимоисключающую группу между различными группами: У меня есть аргументы -a, -b, -c, и я хочу иметь конфликт с -a и -b вместе , или -a и -c вместе. Помощь должна показывать что-то вроде [-a | ([-До нашей эры])].Использование взаимоисключающего между группами

Следующий код, кажется, не имеют взаимоисключающие варианты:

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
main_group = parser.add_mutually_exclusive_group() 
mysub_group = main_group.add_argument_group() 
main_group.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
mysub_group.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 
mysub_group.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

PARSING различные комбинации - все проход:

> python myscript.py -h 
usage: myscript.py [-h] [-a] [-b] [-c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
> python myscript.py -a -c 
> python myscript.py -a -b 
> python myscript.py -b -c 

Я попытался изменить mysub_group быть add_mutually_exclusive_group превращает все в обоюдно не включенные в другие категории:

> python myscript.py -h 
usage: myscript.py [-h] [-a | -b | -c] 

My desc 

optional arguments: 
    -h, --help show this help message and exit 
    -a   a help 
    -b   b help 
    -c   c help 

Как добавить аргументы для [-a | ([-До нашей эры])]?

ответ

1

Так, это было задано несколько раз. Простой ответ: «с argparse, вы не можете». Однако это простой ответ. Вы можете использовать subparsers, так:

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
sub_parsers = parser.add_subparsers() 
parser_a = sub_parsers.add_parser("a", help='a help') 
parser_b = sub_parsers.add_parser("b", help='b help') 
parser_b.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
parser.parse_args() 

Затем вы получите:

$ python parser -h 
usage: parser [-h] {a,b} ... 

My desc 

positional arguments: 
    {a,b} 
    a   a help 
    b   b help 

optional arguments: 
    -h, --help show this help message and exit 

и:

$ python parser b -h 
usage: parser b [-h] [-c] 

optional arguments: 
    -h, --help show this help message and exit 
    -c   c help 

Если вы предпочли бы ваши аргументы, как указано в вопросе, есть посмотрите на docopt, он выглядит прекрасным и должен делать именно то, что вы хотите.

+0

Не совсем то, что я хочу, так как это не дает мне возможность просто иметь -c (без -b). – itzhaki

+0

Это правда, мои извинения. Я не думаю, что вы можете получить именно то, что хотите, с помощью argparse, но я все же считаю, что docopt - хороший выбор, вы просто добавили бы использование : myscript.py [-h | -a | [-b -c]] к вашей докстерингу, и все будет хорошо для вас –

0

argument_groups не влияют на разбор. Они просто способствуют форматированию справки. Поэтому определение группы в пределах mutually_exclusive_group не помогает с этой проблемой.

Существует планируемая патч, http://bugs.python.org/issue10984, 'argparse add_mutually_exclusive_group should accept existing arguments to register conflicts', что позволило бы определить два mutually_exclusive_groups, один [-a | -b] и другой [-a | -c]. Создание второй группы, содержащей аргумент (-a), который уже определен, является тривиальной частью этого патча. Создание значимой строки использования сложнее и требует перезаписи нескольких методов HelpFormatter.

import argparse 
parser = argparse.ArgumentParser(description='My desc') 
group1 = parser.add_mutually_exclusive_group() 
action_a = group1.add_argument("-a", dest='a', action='store_true', default=False, help='a help') 
group1.add_argument("-b", dest='b', action='store_true',default=False,help='b help') 

group2 = parser.add_mutually_exclusive_group() 
group2.add_argument("-c", dest='c', action='store_true',default=False,help='c help') 
group2._group_actions.append(action_a) # THE KLUDGE 

print parser.format_usage() 
# usage: stack16769409.py [-h] [-a | -b] [-c] 

args = parser.parse_args() 

Usage не отображает 2 группы правильно. Но он принимает -b -c, при этом возражая против -a -b и -a -c. Но вы можете написать пользовательскую строку использования.

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