如何使用下面的代码进行功能测试,在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()
答案 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)