2016-03-15 2 views
2

Я пытаюсь добавить опцию опций в argparse. В настоящее время у меня есть:аргумент опциона опций

group = parser.add_mutually_exclusive_group() 
group.add_argument("--md", help="Create xyz file for each ionic step for" 
        " visualization", action='store_true') 
group.add_argument("--force", help="See which atom has maximum force", 
        action='store_true') 
group.add_argument("--opt", help="grep string from file", 
        nargs=2, metavar=("str", "file")) 
parser.add_argument("--xsf", help="Create xsf file for md(default is xyz)" 
        " visualization", action='store_true') 
parser.add_argument("-N", help="Showing first N line", 
        metavar='integer', type=int) 
parser.add_argument("-n", help="Showing last n line", 
        metavar='integer', type=int) 
args = parser.parse_args() 

, который дает:

./foo.py --h 
usage: foo.py [-h] 
       [--md | --force | --opt str file] 
       [--xsf] [-N integer] [-n integer] 

Но я хочу --xsf как подопции для --md, -N,-n для --opt; например

./foo.py --h 
    usage: foo.py [-h] 
        [--md [--xsf]| --force | --opt str file [-N integer] [-n integer]] 

Но я не знаю, как этого достичь. Может быть, у меня что-то не хватает, но нет такого варианта в argparse doc

Есть ли другой способ получить это?

+0

Если я добавляю xsf в группу, его нельзя использовать с md, они будут взаимно исключающими друг друга. – BaRud

ответ

2

Механизм mutually_exclusive_group довольно прост и не работает с каким-либо гнездом или подгруппировкой.

Существует ошибка/проблема Python, требующая более полного механизма группировки, но предлагаемый патч довольно сложный. Проблема заключается не только в тестировании, но и в определении групп в удобной для пользователя форме, а также при создании строки usage. Приятно, что вы включили нужное использование, но этот формат значительно превосходит возможности текущего форматирования.

Возможно, вы изучите проблему, связанную с подпапкой. субпараметры взаимоисключающие (вы можете дать только одно имя команды), и вы можете указать --xsf в качестве аргумента для md и -N в качестве аргумента для --opt. Но у субпараторов есть свои проблемы с помощью.

Другой маршрут - написать свой собственный usage и выполнить собственное тестирование аргументов после разбора. При подходящем выборе значений по умолчанию вы обычно можете указать, был ли предоставлен аргумент или нет (пользователь не может указать None), или вы можете игнорировать ненужные.