2016-08-17 24 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が真であれば、そのため、どちらの引数の一覧の2番目および3番目の属性が変数に割り当てられているかどうかを確認しようとしています。

これは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.s両方がNoneをしています。 -sと引数の右の数と

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

args.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' 

インデックス付きアクセス: - エラー

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 [110]: args_options(['-s','1','2','3']) 
Out[110]: Namespace(k=None, s=['1', '2', '3']) 

-kリストも有効:args.k[2]

vars(args)は、argsオブジェクトから辞書を作成しますが、アクセスが容易になるとは思いません。

大きなメッセージ - argsを印刷すると、パーサーがどのように生成されているかを確認できます。それが何をしているのか、そしてなぜそれを理解するまで、何度もこれをやり直してください。

あなたは

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

あなたは両方のためのdestを定義し、引数属性の値で終わる可能性が農産物で、-kdefault=[]を与えることができます。

parser.add_argument('-k', '--ko', dest='something', default=[], nargs=3) 
関連する問題