The Argparse Extension provides the ArgparseArgumentHandler for argument parsing, and the ArgparseController for runtime dispatch. Both are the defaults used by Cement.
This extension does not rely on any application level configuration settings or meta options.
Usage
The following is an example application using both the ArgparseArgumentHandler and ArgparseController. Note that the default arg_handler is already set toArgparseArgumentHandler by App.
from cement import App, Controller, exclassBase(Controller):classMeta: label ='base' arguments = [ (['--base-foo'],{'help':'base foo option'}), ]@ex(hide=True)defdefault(self):print('Inside Base.default')if self.app.pargs.base_foo:# do something with self.app.pargs.base_fooprint('Base Foo > %s'% self.app.pargs.base_foo)@ex( arguments=[ (['--command1-opt'], {'help': 'option under command1','action': 'store_true'}) ], aliases=['cmd1'], help='sub-command under myapp base controller', )defcommand1(self):print('Inside Base.command1')if self.app.pargs.command1_opt:# do something with self.app.pargs.command1_optpassclassEmbedded(Controller):classMeta: label ='embedded_controller' stacked_on ='base' stacked_type ='embedded'@expose(help="embedded under base controller")defcommand2(self):print('Inside Embedded.command2')classNested(Controller):classMeta: label ='nested_controller' stacked_on ='base' stacked_type ='nested' arguments = [ (['--nested-opt'],{'help':'option under nested-controller'}), ]@expose(help="sub-command under nested-controller")defcommand3(self):print('Inside Nested.command3')classMyApp(App):classMeta: label ='myapp' handlers = [ Base, Embedded, Nested, ]withMyApp()as app: app.run()
$ python myapp.py --help
usage: myapp.py [-h] [--quiet] [--base-foo BASE_FOO]
{nested-controller,command1,cmd1,default,command2} ...
optional arguments:
-h, --help show this help message and exit
--quiet suppress all output
--base-foo BASE_FOO base foo option
sub-commands:
{nested-controller,command1,cmd1,default,command2}
nested-controller nested-controller controller
command1 (cmd1) command1 is a sub-command under base controller
command2 command2 embedded under base controller
$ python myapp.py --base-foo bar
Inside Base.default
Base Foo > bar
$ python myapp.py command1 --help
usage: myapp.py command1 [-h] [--command1-opt]
optional arguments:
-h, --help show this help message and exit
--command1-opt option under command1
$ python myapp.py command1
Inside Base.command1
$ python myapp.py command2
Inside Embedded.command2
$ python myapp.py nested-controller --help
usage: myapp.py nested-controller [-h] [--nested-opt] {command3} ...
optional arguments:
-h, --help show this help message and exit
--nested-opt option under nested-controller
sub-commands:
{command3}
command3 command3 under nested-controller
$ python myapp.py nested-controller command3
Inside Nested.command3