Аргументы аргументов argparse

У меня есть следующий код в python:

parser = argparse.ArgumentParser(description='Deployment tool')
group = parser.add_mutually_exclusive_group()
group.add_argument('-a', '--add', dest='name_to_add', help='Add a new group or a role to existing group')
group.add_argument('-u', '--upgrade', dest='name_to_upgrade', help='Upgrade a group with the new version')
parser.add_argument('--web_port', help='Port of the WEB instance that is being added to the group')

Моя проблема связана с опцией "--web_port". Я хочу добавить эту опцию только с опцией "-a", но не с "-u".

Я хочу, чтобы иметь возможность запускать: "python my_script.py -a name --web_port = XXXX".

Я не хочу, чтобы мог работать: "python my_script.py -u name --web_port = XXXX"

Как мне изменить свой код, чтобы иметь возможность запускать его таким образом?

Спасибо, Аршавский Александр.

Ответ 1

Вместо опций -a и -u, вы можете сделать их подкомандами. Затем сделайте --web-port опцию подкоманды add:

python my_script.py add name --web_port=XXXX
python my_script.py upgrade name

Что-то вроде:

parser = argparse.ArgumentParser(description='Deployment tool')
subparsers = parser.add_subparsers()

add_p = subparsers.add_parser('add')
add_p.add_argument("name")
add_p.add_argument("--web_port")
...

upg_p = subparsers.add_parser('upgrade')
upg_p.add_argument("name")
...

Если вы попробуете запустить

my_script.py upgrade name --web_port=1234

вы получите сообщение об ошибке для нераспознанного аргумента "--web_port".

Аналогично, если вы попробуете

my_script.py add name upgrade

вы получите сообщение об ошибке "обновление" без признания вы только определили один позиционный аргумент для подкоманды 'add'.

Другими словами, подкоманды неявно взаимно исключают друг друга. Единственный крошечная бородавка заключается в том, что вам нужно добавить параметр "имя" для каждого subparser.