在Python中使用argparse为具有两个值的参数设置单独的选项

在Python中使用argparse为具有两个值的参数设置单独的选项,python,argparse,Python,Argparse,我目前拥有以下代码: 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, cho

我目前拥有以下代码:

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电子邮件-a1test@email.com
您只需发送电子邮件即可test@gmail.com

不确定这是否会对今后的任何人有所帮助,但我最终还是按照亚历克斯的建议做了。唯一的问题是我用了
~
而不是
,因为我必须用端口处理IP地址,所以使用
会把事情搞砸。

老问题,但我自己也在学习,我想我会发布一个答案。
nargs
参数可以解决这个问题,但显然不能与
选项
组合使用,因为它也适用于电子邮件地址:

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)
...

一封更简单的
-m1电子邮件怎么样:test@gmail.com
?我对
argparse
还不太了解,不知道让它为一个选项吞下两个arg有多容易(如果可行的话),但作为一个用户,我会对这种奇怪的解析行为感到惊讶,而
键入:wh@tever
让我感觉非常自然。另外,对精确的五个地址的限制看起来有点随意。也许你只是想把地址作为位置参数,把IMEI作为选项?你可以让它接受两个带有
nargs=2
的参数,然后解析输出(不过你的
选项=
不能用它)。但是我猜你是用
~
方法的。