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