我想使用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来传递来自解析器的参数似乎有点笨拙。
有没有办法清理它?
答案 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
方法。