Danilo Chilene wrote: > Hello, > > I have the code below: > > 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() > > It's working for functions foo and bar: > > 5: python arg.py foo > foo > > 5: python arg.py bar > bar > > 5: python arg.py test a b > usage: arg.py [-h] method > arg.py: error: unrecognized arguments: a b > > > But for function test I guess I'm missing something, the idea is to > have N functions and N param. > > Any ideas?
You can either keep it simple and use sys.argv with getattr(self, sys.argv[1])(*sys.argv[2:]) or you can have a look at subparsers. I took a stab at that: $ cat automatic_subparsers.py import argparse import inspect 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): 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) if __name__ == "__main__": main = Main() main() $ python automatic_subparsers.py -h usage: automatic_subparsers.py [-h] {bar,foo,test} ... positional arguments: {bar,foo,test} optional arguments: -h, --help show this help message and exit $ python automatic_subparsers.py bar -h usage: automatic_subparsers.py bar [-h] optional arguments: -h, --help show this help message and exit $ python automatic_subparsers.py bar bar $ python automatic_subparsers.py test -h usage: automatic_subparsers.py test [-h] name place positional arguments: name place optional arguments: -h, --help show this help message and exit $ python automatic_subparsers.py test me here me here There may be a library out there that does this with bells and whistles, but I haven't looked. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor