2010-07-13 56 views
1
使用argparse兩個值

目前,我有以下代碼:設置單獨的選項爲參數使用Python

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 [email protected],你可以只是做-m1 email [email protected]

+2

怎麼樣一個簡單的'-M1電子郵件:測試@ gmail.com'代替?我還不知道'argparse'足以說明它是多麼容易(如果可行),讓它爲一個選項吞噬兩個參數,但作爲用戶,我會對這種奇怪的解析行爲感到驚訝,而'type: wh @ tever'對我來說很自然。 – 2010-07-13 17:23:30

+0

另外,對五個地址的限制看起來有點任意。也許你只是希望將地址作爲位置參數和IMEI作爲選項? – Philipp 2010-07-13 17:51:08

+0

你可以讓它接受'nargs = 2'的兩個參數,然後解析輸出(你的'選擇='不會和那個一起工作)。但我想你是用'〜'方法去的。 – avacariu 2010-08-11 01:08:44

回答

2

不知道這是否會幫助任何人在路上,但我最後做什麼亞歷克斯建議。唯一的是我用~而不是:,因爲我必須處理帶有端口的IP地址,所以使用:會搞砸了。

0

老問題,但我正在瞭解這一點,並認爲我會發表一個答案。該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) 
... 
相關問題