2016-10-28 11 views
0

スイッチをキャプチャするためにArgparseを使用する方法はありますか?それは別のパラメータとして値ですか?Argparseを介して入手可能なスイッチをキャプチャ

I.e.

python MyScript.py --myswitch 10 --yourswitch 'fubar' --herswitch True 

...これはちょうどsys.argvのを使用して働いていた何かのような...

MyScript.var1 == myswitch 
MyScript.var2 == 10 
MyScript.var3 == yourswitch 
MyScript.var4 == 'fubar' 
MyScript.var5 == herswitch 
MyScript.var6 == True 

...か...

{'myswitch':10, 'yourswitch':'fubar', 'herswitch':True} 

で結果=== === EDIT
。 argparseでこれを行う方法はありますか?方法があるとしても、argparseを使うとどんな利点がありますか?

def _parse_unknown_args(self, args): 
    """""" 
    scriptname = args.pop(0) # Just gets rid of it 
    args_dict = {} 
    flags_list = [] 
    key = None 

    for item in args: 
     # Must come first as a 'not' 
     if not item.startswith('-'): 
      # This means is a value, not a switch 
      # Try to add. If value was not preceded by a switch, error 
      if key is None: 
       # We got what appears t be a value before we got a switch 
       err = ''.join(["CorrectToppasPaths._parse_unknown_args: ", "A value without a switch was found. VALUE = '", item, "' (", str(args), ")."]) 
       raise RuntimeError(err) 
      else: 
       # Add it to the dict 
       args_dict[key] = item 
       key = None # RESET! 

     else: # '-' IS in item 
      # If there is ALREADY a switch, add to flags_list and reset 
      if key is not None: 
       flags_list.append(key) 
       key = None # RESET! 
      # Make it a key. always overrides. 
      key = item 
      while key.startswith('-'): key = key[1:] # Pop off the switch marker     

    # Last check. If key is not None here (at end of list) 
    # It was at the end. Add it to flags 
    if key is not None: flags_list.append(key) 

    return args_dict, flags_list 

===

bash-3.2# python correct_toppas_paths.py -a -b -c -set1 1 -set2 2 -d -e 
args_dict= {'set1': '1', 'set2': '2'} 
flags_list= ['a', 'b', 'c', 'd', 'e'] 

答えて

1

が正しくargparseパーサは次のようにNamespaceオブジェクトを生成するコード化された:例えば、このオブジェクトを印刷するためにテストするとき、それは良いアイデアだ

In [267]: args=argparse.Namespace(myswitch='10', yourswitch='fubar', herswitch=True) 

In [269]: args.myswitch 
Out[269]: '10' 

およびドキュメントは、あなたが簡単にそれを回すことができることを示しています

In [268]: args 
Out[268]: Namespace(herswitch=True, myswitch='10', yourswitch='fubar') 

これらの引数の各print(args)は、あなたがアクセスできる属性です(名前は奇妙なものではありません提供) varsと辞書:

In [270]: vars(args) 
Out[270]: {'herswitch': True, 'myswitch': '10', 'yourswitch': 'fubar'} 

残りは普通のPythonのコーディングである - dictionaのオブジェクトの属性やキー/値にアクセスしますry。

+0

ありがとうございました。ですから、私が不明な点は、私たちは「myswitch」、「herswitch」などが何であるかを知りません。これらは、コマンドラインで入力したユーザーによって定義されます。私はargparseがANY UNKNOWNスイッチ(-u、または--unknown)を受け入れ、それを名前空間に追加する方法を見ていませんでした。それは理にかなっていますか? – RightmireM

+0

任意のキーと値のペアを受け入れることについては疑問がありますが、これは 'argparse'(と他のほとんどのパーサーモジュール)の設計意図とは反対です。パーサは、デザイナーに、受け入れられるものを制御します。それは '--myswitch'を受け入れやすく、' --myswatch'を拒否するのを容易にします。 – hpaulj

+0

http://stackoverflow.com/questions/27146262/create-variable-key-value-pairs-with-argparse-python私は 'parse_known_args'の後に、' extras'リストの独自の解析をお勧めします。 – hpaulj

関連する問題