2016-04-12 2 views
0

私は​​ライブラリを使用していくつかの引数を解析したいと思いますが、引数を指定できる無数の方法の中でいくつかのアクションの中から選択するのが最も簡単な方法です。異なるアクションには、異なる数の引数が必要です。argparseを使用して、実行するアクションを選択して引数を渡す方法はありますか?

import argparse 

class MyClass: 
    def __init__(self, someVar): 
     self.someVar = someVar 

    def Action1(self, intToPrint): 
     print("Print 1: %d - %s"%(self.someVar,intToPrint)) 

    def Action2(self, firstNum, firstString): 
     print("Print 2: %d - %d %s"%(self.someVar,firstNum, firstString)) 

def CallAction1(mc, args): 
    mc.Action1(args.intToPrint) 

def CallAction2(mc, args): 
    mc.Action2(args.firstNum, args.firstString) 

def Main(): 
    parser = argparse.ArgumentParser(prog='PythonArgumentParsing.py') 
    subparsers = parser.add_subparsers(help='commands') 

    action1Group = subparsers.add_parser('action1', help='action 1 help') 
    action1Group.add_argument('intToPrint', type=str) 
    action1Group.set_defaults(func=CallAction1) 

    action2Group = subparsers.add_parser('action2', help='action 1 help') 
    action2Group.add_argument('firstNum', type=int) 
    action2Group.add_argument('firstString', type=str) 
    action2Group.set_defaults(func=CallAction2) 

    args = parser.parse_args() 
    someVar = 12345 
    mc = MyClass(someVar) 
    args.func(mc, args) 

if __name__ == "__main__": 
    Main() 

...しかし、作成する必要が少し不格好なようです:次は、動作しているよう

> python MyClass.py action1 foo 
Action 1: 12345 - foo 

> python MyClass.py action2 20 30 
Action 2: 12345 - 20 30 

は、私は次の出力を期待する次の呼び出しを考えますCallActionを使用してパーサから引数を渡します。

これをクリーンアップする方法はありますか?

答えて

1

args名前空間をメソッド呼び出しの定位置パラメーターに変換する関数Call_Action...を記述する必要があるため、ちょっと気になります。

キーワードパラメータを使用すると、この必要性が排除される場合があります。以下は、まだテストされていません。

def Action1(self, intToPrint=None, **kwargs): 
    print("Print 1: %d - %s"%(self.someVar,intToPrint)) 

def Action2(self, firstNum=None, firstString=None, **kwargs): 
    print("Print 2: %d - %d %s"%(self.someVar,firstNum, firstString)) 
... 
action1Group.set_defaults(func=MyClass.Action1) 
... 
args.func(mc, **vars(args)) 

私はこの権利をやった場合、私はこの方法に全体vars(args)辞書を渡すことができます。それは必要なパラメータを使用し、残りは無視します。

​​は、パラメーターを渡す方法を広範囲に使用します。

+0

私はそれを与えましたが、それは私に 'TypeError:Action1()に引数 'intToPrint'の複数の値を与えました。私が呼びたいすべてのメソッドに '** kwargs'を追加する必要があるかどうかは分かりにくいです。 –

+0

Ah、 'mc.Action1'を' MyClass.Action1'に変更してください:-) –

関連する問題