在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, 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 个回答
1
这个问题虽然老旧,但我自己也在学习这个,所以想分享一下我的理解。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)
...
2
不确定这对将来的某些人有没有帮助,但我最后还是按照Alex的建议做了。唯一不同的是,我用了~
而不是:
,因为我需要处理带端口的IP地址,使用:
会搞乱事情。