2017-01-17 3 views
0

Я пытаюсь использовать parser = argparse.ArgumentParser для программы lil, которую я пишу.Использование argparse для принятия только одной группы требуемых аргументов

Программа принимает в качестве входных данных EITHER( пути к текстовому файлу )OR( opt1 && opt2 && opt3 ).

Значение, если пользователь хочет использовать текстовый файл в качестве входных данных он не может обеспечить ни один из opt и если он предоставил opt - он должен предоставить все 3 и не может обеспечить a path to a txt file.

Я пробовал использовать add_mutually_exclusive_group, но не знаю, как это сделать, потому что вторая группа аргументов - это сама группа.

Это то, что я пытался до сих пор:

import argparse 
parser = argparse.ArgumentParser(description='this is the description',) 

root_group = parser.add_mutually_exclusive_group() 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-path', help='path to the txt file') 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-opt1', help='opt1') 
group_list.add_argument('-opt2', help='opt2') 
group_list.add_argument('-opt3', help='opt3') 

args = parser.parse_args() 

-

python tests.py -path txt -opt1 asdasd 
usage: tests.py [-h] [[-path PATH] [-opt1 OPT1 | -opt2 OPT2 | -opt3 OPT3] 
tests.py: error: argument -opt1: not allowed with argument -path 

path не допускается ни с одной из opt - это именно то, что я хочу.

Но я хочу, чтобы, если пользователь поставил даже 1 opt, он должен будет предоставить все из них.

Я также хочу, чтобы по крайней мере 1 группа была удовлетворена.

+1

Пожалуйста, покажите, что вы пробовали, и объясните, как это было недостаточно. –

+0

отредактировал первое сообщение. thanks –

+0

Ваше название вводит в заблуждение; вы хотите все или ничего из набора опций. –

ответ

0

Взаимоисключающие группы не предназначены для гнездования. Он принимает это ваш код, но чистый эффект делает 4 аргумента исключительными. Он будет принимать только один из path, opt1, opt2 и т.д.

Хотя я разведанные определения вложенности групп, а также позволяет any или and операции внутри группы, такая функция является далеко.

Поскольку ваш пользователь должен предоставить все 3 --opt я предлагаю конденсационные, что в один аргумент:

root_group.add_argument('--opt', nargs=3) 
root_group.add_argument('--path') 

Использование должно выглядеть как

usage: tests.py [-h] [--path PATH | --opt OPT OPT OPT] 

Контраст, что с гипотетическим использования, что позволяет nested inclusive groups:

[-path PATH | [-opt1 OPT1 & -opt2 OPT2 & -opt3 OPT3]] 

========== ==

С кортежа metavar, использование может быть уточнена в:

g.add_argument('--opt',nargs=3,metavar=('OPT1','OPT2','OPT3')) 

usage: ipython3 [-h] [--path PATH | --opt OPT1 OPT2 OPT3] 

=============

Другой вариант заключается в написании пользовательских usage и выполнить логические тесты после разбора.