Argparse函数Python

时间:2013-05-06 14:09:45

标签: python argparse

如何使用下面的代码进行功能测试,在foo和bar上它可以正常工作。

import argparse

class Myclass(object):

    def foo(self):
        print 'foo'

    def bar(self):
        print 'bar'

    def test(self,name,place):
        print name, place


class Main(Myclass):
    def __init__(self):
        foo_parser = argparse.ArgumentParser()
        foo_parser.add_argument('method')
        self.args = foo_parser.parse_args()

    def __call__(self, *args, **kws):
        method = self.args.method
        return getattr(self, method)(*args, **kws)


if __name__ == "__main__":
    main = Main()

    main()

2 个答案:

答案 0 :(得分:0)

test需要args。您没有将任何内容传递给main(),因此无法传递__call__()

您可能希望将此类内容添加到__init__()

  parser.add_argument('arguments', nargs=argparse.REMAINDER)

然后将main.args.arguments传回动态调用。

答案 1 :(得分:0)

我得到的解决方案如下:

def __init__(self):
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    for name in dir(self):
        if not name.startswith("_"):
            p = subparsers.add_parser(name)
            method = getattr(self, name)
            argnames = inspect.getargspec(method).args[1:]
            for argname in argnames:
                p.add_argument(argname)
            p.set_defaults(func=method, argnames=argnames)
    self.args = parser.parse_args()

def __call__(self):
    a = self.args
    callargs = [getattr(a, name) for name in a.argnames]
    return self.args.func(*callargs)