2016-03-24 92 views
3

我創建了一個argparse參數,它僅支持3種選擇:Argparse參數與附加價值

parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3'), help='message') 

但我必須添加一個新的特殊選擇ch4這將需要額外的價值。 即,我的程序應該支持這樣的輸入:

./prog.py --param ch1 
./prog.py --param ch2 # or ch3 
./prog.py --param ch4='some_additional_variable' 

我怎麼能認識到這一點(或者一些類似的行爲)?

+1

我不認爲這是「開箱即用」。您可能需要刪除'choices',添加'nargs = *',然後自己執行驗證(解析命令後,或在自定義的'type'函數或'argparse.Action'中)。 – mgilson

+0

你想看什麼用法和幫助? – hpaulj

回答

1

add_argument方法需要type關鍵字參數。任何可調用對象都可以作爲參數傳遞給這個參數。
這是一個可以傳遞給add_argument方法的類,它可以滿足您的要求。

import argparse 

class Arg(object): 
    def __init__(self, value): 
     self.value = value 
     if '=' in value: 
      self.value = value.split('=', 1) 

    def __str__(self): 
     return '{}=<{}>'.format(self.value[0], self.value[1]) if isinstance(self.value, list) else self.value 

    def __repr__(self): 
     if isinstance(self.value, list): 
      return repr('{}=<value>'.format(self.value[0])) 
     return '{}'.format(repr(self.value)) 

    def __eq__(self, value): 
     return '{}'.format(repr(value)) == repr(self) 

parser = argparse.ArgumentParser() 
parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4=<value>'), type=Arg) 

args = parser.parse_args('--param ch4=123'.split()) 
print('choice {}, value {}'.format(args.param, repr(args.param.value))) 

args = parser.parse_args([]) 
print('choice {}, value {}'.format(args.param, repr(args.param.value))) 

args = parser.parse_args('--param ch3'.split()) 
print('choice {}, value {}'.format(args.param, repr(args.param.value))) 

輸出;

choice ch4=<123>, value ['ch4', '123'] 
choice ch1, value 'ch1' 
choice ch3, value 'ch3' 

args.paramArg一個實例。 args.param.valuestrlist如果選擇是ch4='some_value'

2

您可以通過requiring an additional argument如果ch4參數是設置變通辦法:

import argparse 

parser = argparse.ArgumentParser(description='...') 
parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4')) 
parser.add_argument('--setting', help="Required if param is set to ch4") 

args = parser.parse_args()  
if args.param == "ch4" and not args.setting: 
    parser.error("--setting is required if param is ch4") 

用法:

$ python test.py --param ch1 
$ python test.py --param ch2 
$ python test.py --param ch3 
$ python test.py --param ch4 
usage: test.py [-h] [--param {ch1,ch2,ch3,ch4}] [--setting SETTING] 
test.py: error: --setting is required if param is ch 
$ python test.py --param ch4 --setting "some_value" 
$