你应该如何使用argparse选择要执行的操作并将参数传递给它?

时间:2016-04-12 10:21:01

标签: python-3.4 argparse

我想使用argparse库来解析一些参数,但我正在努力弄清楚在无数种方法中你可以指定参数是在几个动作之间进行选择的最简单方法。不同的动作需要不同数量的参数。

鉴于以下呼叫,我希望得到以下输出:

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

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

以下似乎有效:

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()

...但是必须创建一个CallAction来传递来自解析器的参数似乎有点笨拙。

有没有办法清理它?

1 个答案:

答案 0 :(得分:1)

我认为你只是需要编写将Call_Action...命名空间转换为方法调用的位置参数的args函数而烦恼。

使用关键字参数可能会消除这种需求。以下内容尚未经过测试:

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)字典传递给方法。它将使用它需要的参数,并忽略其余的参数。

argparse广泛使用传递参数的**kwargs方法。