Установка отдельных вариантов для аргумента с двумя значениями с использованием argparse в Python - PullRequest
1 голос
/ 13 июля 2010

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

import argparse

parser = argparse.ArgumentParser(description='Adds a new modem to Iridium account')
parser.add_argument('imei', metavar='I', nargs=1, help='the modems IMEI')
parser.add_argument('-t1', '--type1', metavar='t1', nargs=1, choices=('email', 'directip', 'sbddevice'), default='directip', help='Call type (default: directip)')
parser.add_argument('-a1', '--address1', metavar='a1', nargs=1, default='75.101.138.217:9097', help='Call address (default: 75.101.138.217:9097)')
parser.add_argument('-t2', '--type2', metavar='t2', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type')
parser.add_argument('-a2', '--address2', metavar='a2', nargs=1, help='Call address')
parser.add_argument('-t3', '--type3', metavar='t3', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type')
parser.add_argument('-a3', '--address3', metavar='a3', nargs=1, help='Call address')
parser.add_argument('-t4', '--type4', metavar='t4', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type')
parser.add_argument('-a4', '--address4', metavar='a4', nargs=1, help='Call address')
parser.add_argument('-t5', '--type5', metavar='t5', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type')
parser.add_argument('-a5', '--address5', metavar='a5', nargs=1, help='Call address')

args = parser.parse_args()

Есть ли способ, которым я могу объединить все -t и -a в, скажем, -m1, -m2, -m3, -m4, -m5, где t - это первое значение аргумента, которое тот же выбор ниже и -a второй аргумент, но не ограничен тем же выбором, что и первое значение? Похоже, что вы должны быть в состоянии сделать это, иначе вам придется выполнить кучу проверок позже, чтобы увидеть, есть ли t1 и a1, поскольку, если пользователь предоставляет одно, ему нужно предоставить другое.

Таким образом, вместо того, чтобы делать -t1 email -a1 test@email.com, вы можете просто сделать -m1 email test@gmail.com

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Не уверен, поможет ли это кому-нибудь в будущем, но в итоге я сделал то, что предложил Алекс. Единственное, что я использовал ~ вместо :, потому что мне приходилось обрабатывать IP-адреса с портами, поэтому использование : могло бы испортить ситуацию.

0 голосов
/ 29 апреля 2016

Старый вопрос, но я сам узнаю об этом и думал, что выложу ответ. Параметр nargs может позаботиться об этом, но, очевидно, его нельзя объединить с choices, поскольку он будет применяться и к адресу электронной почты:

import argparse

parser = argparse.ArgumentParser(
    description='Adds a new modem to Iridium account',
    formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument('imei', metavar='I', help="the modem's IMEI")
parser.add_argument('-m1', nargs=2, metavar=("type","address"), default=['directip', '75.101.138.217:9097'], help='Call setting')
parser.add_argument('-m2', nargs=2, metavar=("type","address"), help='Call setting')
parser.add_argument('-m3', nargs=2, metavar=("type","address"), help='Call setting')
parser.add_argument('-m4', nargs=2, metavar=("type","address"), help='Call setting')
parser.add_argument('-m5', nargs=2, metavar=("type","address"), help='Call setting')

args = parser.parse_args()

type1 = args.multi1[0]
address1 = args.multi1[1]
if not type1 in ['email', 'directip', 'sbddevice']:
    args.print_help()
    sys.exit(1)
...
...