2016-08-17 36 views
1

我試圖根據屬性列表中的位置來分配多個參數屬性。舉個例子;將變量分配給多個argparse屬性

import argparse 
import sys 

def args_options: 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-s', help='-s argument help', nargs=3) 
    parser.add_argument('-k', help='-k argument help', nargs=3) 
    arguments = parser.parse_args() 

    return arguments 

def assign_arg(): 
    args = args_options() 

    if args.s or args.k: 
     variable1 = args[1] # this is where I'm stuck as I know this won't work 
     variable2 = args[2] #^

從上面的,我想,以檢查是否任何arg.s或arg.k是真實的,如果是這樣,然後在任一參數列表中的第二個和第三個屬性分配給變量。

是否有可能用python做到這一點?或者我需要去做;

if arg.s: 
    variable1 = arg.s[1] 
    variable2 = arg.s[2] 
elif arg.k: 
    variable1 = arg.k[1] 
    variable2 = arg.k[2]  

上面的工作,但我有很多的選項/屬性,所以代碼可能會變長。希望通過在多個參數選項列表中查找屬性並將其分配給一個變量來更有效地實現它。

+0

你的選擇不是一個互斥的組,如果指定了'-s'和'-k'? –

+0

似乎'-s'或'-k'的參數是以相同的方式處理的,將s/k作爲標誌並分別處理參數不是更有意義嗎? –

回答

0

運行解析器與各種輸入,並看看結果:

In [108]: def args_options(argv=None): 
    ...:  parser = argparse.ArgumentParser() 
    ...:  parser.add_argument('-s', help='-s argument help', nargs=3) 
    ...:  parser.add_argument('-k', help='-k argument help', nargs=3) 
    ...:  arguments = parser.parse_args(argv) 
    ...:  return arguments 
    ...: 

不帶任何參數 - 無論是args.kargs.sNone

In [109]: args_options([]) 
Out[109]: Namespace(k=None, s=None) 

隨着-s和參數的正確數目,args.s是3個字符串列表。

In [110]: args_options(['-s','1','2','3']) 
Out[110]: Namespace(k=None, s=['1', '2', '3']) 

-k不帶參數 - 錯誤

In [111]: args_options(['-s','1','2','3', '-k']) 
usage: ipython3 [-h] [-s S S S] [-k K K K] 
ipython3: error: argument -k: expected 3 arguments 
An exception has occurred, use %tb to see the full traceback. 

SystemExit: 2 



In [112]: args_options(['-s','1','2','3', '-k','4','5','6']) 
Out[112]: Namespace(k=['4', '5', '6'], s=['1', '2', '3']) 

K和S - 既作爲3元列出

測試一個例子,我們可以這樣做:

In [113]: args=args_options(['-k','1','2','3']) 
In [114]: args.s is None 
Out[114]: True 
In [115]: args.k is None 
Out[115]: False 
In [116]: a,b,c = args.k # unpack to variables 
In [117]: a 
Out[117]: '1' 
In [118]: b 
Out[118]: '2' 
In [119]: c 
Out[119]: '3' 

的索引訪問清單也有效:args.k[2]

vars(args)args對象創建一本字典,但我不認爲這使訪問更容易。

大消息 - 打印args看看你的解析器產生什麼。一遍又一遍地做,直到你明白它在做什麼和爲什麼。

你可以給一個-kdefault=[],在生產

In [123]: args=args_options(['-s','1','2','3']) 
In [124]: args 
Out[124]: Namespace(k=[], s=['1', '2', '3']) 

可以定義爲既是dest,並與在ARGS屬性值告終。

parser.add_argument('-k', '--ko', dest='something', default=[], nargs=3) 
相關問題