0

下面的代码如何用于功能测试,在 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()
4

2 回答 2

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)
于 2013-06-28T22:09:13.030 回答
0

test需要参数。您没有将任何内容传递给对 的调用main(),因此没有可传递的内容__call__()

你可能想添加这样的东西__init__()

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

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

于 2013-05-06T14:25:06.470 回答