optional arguments with compact reporting in optparse

Steven Bethard steven.bethard at gmail.com
Mon Nov 12 17:33:55 EST 2007


braver wrote:
> Steve -- thanks for your pointer to argparse, awesome progress --
> optional arguments.
> 
> However, I still wonder how I do reporting.  The idea is that there
> should be a list with tuples of the form:
> 
> (short, long, value, help)
> 
> -- for all options, regardless of whether they were specified on the
> command line or not.
> 
> Moreover, a way to create such list should be incremental -- in ruby I
> define things around each option definition and add a new tuple to the
> reporting list right after the block defining the option.
> 
> The idea is, -- help should report on all options with their actual or
> default values, and everything pertaining to one option -- its
> definition, callbacks, and adding it to the reporting list -- must be
> in vicinity of each other, so I don't forget to output some stuff
> about an option ten options below...  The snippet I've shown pretty
> much does it in Ruby.

I guess I still don't understand how that's different from what 
add_argument (or add_option) and print_help currently do::

     >>> parser = argparse.ArgumentParser()
     >>> parser.add_argument('-P', nargs='?', const='data', help='PP')
     >>> parser.add_argument('--foo', help='FOO')
     >>> parser.print_help()
     usage:  [-h] [-P [P]] [--foo FOO]

     optional arguments:
       -h, --help  show this help message and exit
       -P [P]      PP
       --foo FOO   FOO

Everything pertaining to one option is grouped together in a single 
add_argument call (add_option if you're using optparse). And you don't 
forget what to output because the print_help() method already takes care 
of it all. Or are you asking for more information (e.g. default values) 
to be included in the help output? I've been hesitant to do that 
automatically because often the default values do not have a useful 
printable form (e.g. when the default is a function or class object).

> Ah, yeah, and another thing -- I want to define a module with about 10
> options common for a project.  Then I'd import it in scripts, and
> there should be three things doable with the preexisting default
> options:
> 
> -- turn off any of them
> -- supply new defaults to any of them
> -- add new options in the same way
> 
> Wonder how brave pythonistas do that!

With argparse, it would look something like::

     import mod
     parser = argparse.ArgumentParser(parents=[mod.parser])
     # supply new default
     parser.set_defaults(foo='bar')
     # add new option
     parser.add_argument('--bar', ...)

The parents= keyword argument is documented here:

     http://argparse.python-hosting.com/wiki/ArgumentParser/parents

Currently, there isn't a way to turn off an argument. I'd instead 
suggest that you create a new parser that doesn't have the extra 
options, and have the parser with more options include that one using 
parents=.

STeVe



More information about the Python-list mailing list