1693 lines
61 KiB
TeX
1693 lines
61 KiB
TeX
|
\section{\module{optparse} ---
|
||
|
Powerful parser for command line options.}
|
||
|
|
||
|
\declaremodule{standard}{optparse}
|
||
|
\moduleauthor{Greg Ward}{gward@python.net}
|
||
|
\sectionauthor{Johannes Gijsbers}{jlgijsbers@users.sf.net}
|
||
|
\sectionauthor{Greg Ward}{gward@python.net}
|
||
|
|
||
|
\modulesynopsis{Powerful, flexible, extensible, easy-to-use command-line
|
||
|
parsing library.}
|
||
|
|
||
|
\versionadded{2.3}
|
||
|
|
||
|
The \module{optparse} module is a powerful, flexible, extensible,
|
||
|
easy-to-use command-line parsing library for Python. Using
|
||
|
\module{optparse}, you can add intelligent, sophisticated handling of
|
||
|
command-line options to your scripts with very little overhead.
|
||
|
|
||
|
Here's an example of using \module{optparse} to add some command-line
|
||
|
options to a simple script:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
from optparse import OptionParser
|
||
|
[...]
|
||
|
parser = OptionParser()
|
||
|
parser.add_option("-f", "--file", dest="filename",
|
||
|
help="write report to FILE", metavar="FILE")
|
||
|
parser.add_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose", default=1,
|
||
|
help="don't print status messages to stdout")
|
||
|
|
||
|
(options, args) = parser.parse_args()
|
||
|
\end{verbatim}
|
||
|
|
||
|
With these few lines of code, users of your script can now do the
|
||
|
"usual thing" on the command-line:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
$ <yourscript> -f outfile --quiet
|
||
|
$ <yourscript> -qfoutfile
|
||
|
$ <yourscript> --file=outfile -q
|
||
|
$ <yourscript> --quiet --file outfile
|
||
|
\end{verbatim}
|
||
|
|
||
|
(All of these result in \code{options.filename == "outfile"} and
|
||
|
\code{options.verbose == 0} ...just as you might expect.)
|
||
|
|
||
|
Even niftier, users can run one of
|
||
|
\begin{verbatim}
|
||
|
$ <yourscript> -h
|
||
|
$ <yourscript> --help
|
||
|
\end{verbatim}
|
||
|
and \module{optparse} will print out a brief summary of your script's
|
||
|
options:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
usage: <yourscript> [options]
|
||
|
|
||
|
options:
|
||
|
-h, --help show this help message and exit
|
||
|
-fFILE, --file=FILE write report to FILE
|
||
|
-q, --quiet don't print status messages to stdout
|
||
|
\end{verbatim}
|
||
|
|
||
|
That's just a taste of the flexibility \module{optparse} gives you in
|
||
|
parsing your command-line.
|
||
|
|
||
|
\subsection{The Tao of Option Parsing\label{optparse-tao}}
|
||
|
|
||
|
\module{optparse} is an implementation of what I have always
|
||
|
considered the most obvious, straightforward, and user-friendly way to
|
||
|
design a user interface for command-line programs. In short, I have
|
||
|
fairly firm ideas of the Right Way (and the many Wrong Ways) to do
|
||
|
argument parsing, and \module{optparse} reflects many of those ideas.
|
||
|
This section is meant to explain this philosophy, which in turn is
|
||
|
heavily influenced by the Unix and GNU toolkits.
|
||
|
|
||
|
\subsubsection{Terminology\label{optparse-terminology}}
|
||
|
|
||
|
First, we need to establish some terminology.
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{argument}
|
||
|
a chunk of text that a user enters on the command-line, and that the
|
||
|
shell passes to \cfunction{execl()} or \cfunction{execv()}. In
|
||
|
Python, arguments are elements of
|
||
|
\var{sys.argv[1:]}. (\var{sys.argv[0]} is the name of the program
|
||
|
being executed; in the context of parsing arguments, it's not very
|
||
|
important.) Unix shells also use the term ``word''.
|
||
|
|
||
|
It's occasionally desirable to substitute an argument list other
|
||
|
than \var{sys.argv[1:]}, so you should read ``argument'' as ``an element of
|
||
|
\var{sys.argv[1:]}, or of some other list provided as a substitute for
|
||
|
\var{sys.argv[1:]}''.
|
||
|
|
||
|
\term{option}
|
||
|
an argument used to supply extra information to guide or customize
|
||
|
the execution of a program. There are many different syntaxes for
|
||
|
options; the traditional Unix syntax is \programopt{-} followed by a
|
||
|
single letter, e.g. \programopt{-x} or \programopt{-F}. Also,
|
||
|
traditional Unix syntax allows multiple options to be merged into a
|
||
|
single argument, e.g. \programopt{-x -F} is equivalent to
|
||
|
\programopt{-xF}. The GNU project introduced \longprogramopt{}
|
||
|
followed by a series of hyphen-separated words,
|
||
|
e.g. \longprogramopt{file} or \longprogramopt{dry-run}. These are
|
||
|
the only two option syntaxes provided by \module{optparse}.
|
||
|
|
||
|
Some other option syntaxes that the world has seen include:
|
||
|
|
||
|
\begin{itemize}
|
||
|
\item a hyphen followed by a few letters, e.g. \programopt{-pf} (this is
|
||
|
*not* the same as multiple options merged into a single
|
||
|
argument.)
|
||
|
\item a hyphen followed by a whole word, e.g. \programopt{-file} (this is
|
||
|
technically equivalent to the previous syntax, but they aren't
|
||
|
usually seen in the same program.)
|
||
|
\item a plus sign followed by a single letter, or a few letters,
|
||
|
or a word, e.g. \programopt{+f}, \programopt{+rgb}.
|
||
|
\item a slash followed by a letter, or a few letters, or a word, e.g.
|
||
|
\programopt{/f}, \programopt{/file}.
|
||
|
\end{itemize}
|
||
|
|
||
|
These option syntaxes are not supported by \module{optparse}, and they
|
||
|
never will be. (If you really want to use one of those option
|
||
|
syntaxes, you'll have to subclass OptionParser and override all the
|
||
|
difficult bits. But please don't! \module{optparse} does things the
|
||
|
traditional Unix/GNU way deliberately; the first three are
|
||
|
non-standard anywhere, and the last one makes sense only if you're
|
||
|
exclusively targeting MS-DOS/Windows and/or VMS.)
|
||
|
|
||
|
\term{option argument}
|
||
|
an argument that follows an option, is closely associated with that
|
||
|
option, and is consumed from the argument list when the option is.
|
||
|
Often, option arguments may also be included in the same argument as
|
||
|
the option, e.g. :
|
||
|
|
||
|
\begin{verbatim}
|
||
|
["-f", "foo"]
|
||
|
\end{verbatim}
|
||
|
|
||
|
may be equivalent to:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
["-ffoo"]
|
||
|
\end{verbatim}
|
||
|
|
||
|
(\module{optparse} supports this syntax.)
|
||
|
|
||
|
Some options never take an argument. Some options always take an
|
||
|
argument. Lots of people want an ``optional option arguments'' feature,
|
||
|
meaning that some options will take an argument if they see it, and
|
||
|
won't if they don't. This is somewhat controversial, because it makes
|
||
|
parsing ambiguous: if \programopt{-a} takes an optional argument and
|
||
|
\programopt{-b} is another option entirely, how do we interpret
|
||
|
\programopt{-ab}? \module{optparse} does not currently support this.
|
||
|
|
||
|
\term{positional argument}
|
||
|
something leftover in the argument list after options have been
|
||
|
parsed, ie. after options and their arguments have been parsed and
|
||
|
removed from the argument list.
|
||
|
|
||
|
\term{required option}
|
||
|
an option that must be supplied on the command-line; the phrase
|
||
|
"required option" is an oxymoron and I personally consider it poor UI
|
||
|
design. \module{optparse} doesn't prevent you from implementing
|
||
|
required options, but doesn't give you much help at it either. See
|
||
|
Extending Examples (section \ref{optparse-extending-examples}) for two
|
||
|
ways to implement required options with \module{optparse}.
|
||
|
|
||
|
\end{definitions}
|
||
|
|
||
|
For example, consider this hypothetical command-line:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
prog -v --report /tmp/report.txt foo bar
|
||
|
\end{verbatim}
|
||
|
|
||
|
\programopt{-v} and \longprogramopt{report} are both options. Assuming
|
||
|
the \longprogramopt{report} option takes one argument,
|
||
|
``/tmp/report.txt'' is an option argument. ``foo'' and ``bar'' are
|
||
|
positional arguments.
|
||
|
|
||
|
\subsubsection{What are options for?\label{optparse-options}}
|
||
|
|
||
|
Options are used to provide extra information to tune or customize the
|
||
|
execution of a program. In case it wasn't clear, options are usually
|
||
|
\emph{optional}. A program should be able to run just fine with no
|
||
|
options whatsoever. (Pick a random program from the Unix or GNU
|
||
|
toolsets. Can it run without any options at all and still make sense?
|
||
|
The only exceptions I can think of are find, tar, and dd -- all of
|
||
|
which are mutant oddballs that have been rightly criticized for their
|
||
|
non-standard syntax and confusing interfaces.)
|
||
|
|
||
|
Lots of people want their programs to have ``required options''.
|
||
|
Think about it. If it's required, then it's \emph{not optional}! If
|
||
|
there is a piece of information that your program absolutely requires
|
||
|
in order to run successfully, that's what positional arguments are
|
||
|
for. (However, if you insist on adding ``required options'' to your
|
||
|
programs, look in Extending Examples (section
|
||
|
\ref{optparse-extending-examples}) for two ways of implementing them
|
||
|
with \module{optparse}.)
|
||
|
|
||
|
Consider the humble \program{cp} utility, for copying files. It
|
||
|
doesn't make much sense to try to copy files without supplying a
|
||
|
destination and at least one source. Hence, \program{cp} fails if you
|
||
|
run it with no arguments. However, it has a flexible, useful syntax
|
||
|
that does not rely on options at all:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
$ cp SOURCE DEST
|
||
|
$ cp SOURCE ... DEST-DIR
|
||
|
\end{verbatim}
|
||
|
|
||
|
You can get pretty far with just that. Most \program{cp}
|
||
|
implementations provide a bunch of options to tweak exactly how the
|
||
|
files are copied: you can preserve mode and modification time, avoid
|
||
|
following symlinks, ask before clobbering existing files, etc. But
|
||
|
none of this distracts from the core mission of \program{cp}, which is
|
||
|
to copy one file to another, or N files to another directory.
|
||
|
|
||
|
\subsubsection{What are positional arguments for? \label{optparse-positional-arguments}}
|
||
|
|
||
|
In case it wasn't clear from the above example: positional arguments
|
||
|
are for those pieces of information that your program absolutely,
|
||
|
positively requires to run.
|
||
|
|
||
|
A good user interface should have as few absolute requirements as
|
||
|
possible. If your program requires 17 distinct pieces of information in
|
||
|
order to run successfully, it doesn't much matter \emph{how} you get that
|
||
|
information from the user -- most people will give up and walk away
|
||
|
before they successfully run the program. This applies whether the user
|
||
|
interface is a command-line, a configuration file, a GUI, or whatever:
|
||
|
if you make that many demands on your users, most of them will just give
|
||
|
up.
|
||
|
|
||
|
In short, try to minimize the amount of information that users are
|
||
|
absolutely required to supply -- use sensible defaults whenever
|
||
|
possible. Of course, you also want to make your programs reasonably
|
||
|
flexible. That's what options are for. Again, it doesn't matter if
|
||
|
they are entries in a config file, checkboxes in the ``Preferences''
|
||
|
dialog of a GUI, or command-line options -- the more options you
|
||
|
implement, the more flexible your program is, and the more complicated
|
||
|
its implementation becomes. It's quite easy to overwhelm users (and
|
||
|
yourself!) with too much flexibility, so be careful there.
|
||
|
|
||
|
\subsection{Basic Usage\label{optparse-basic-usage}}
|
||
|
|
||
|
While \module{optparse} is quite flexible and powerful, you don't have
|
||
|
to jump through hoops or read reams of documentation to get it working
|
||
|
in basic cases. This document aims to demonstrate some simple usage
|
||
|
patterns that will get you started using \module{optparse} in your
|
||
|
scripts.
|
||
|
|
||
|
To parse a command line with \module{optparse}, you must create an
|
||
|
\class{OptionParser} instance and populate it. Obviously, you'll have
|
||
|
to import the \class{OptionParser} classes in any script that uses
|
||
|
\module{optparse}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
from optparse import OptionParser
|
||
|
\end{verbatim}
|
||
|
|
||
|
Early on in the main program, create a parser:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser()
|
||
|
\end{verbatim}
|
||
|
|
||
|
Then you can start populating the parser with options. Each option is
|
||
|
really a set of synonymous option strings; most commonly, you'll have
|
||
|
one short option string and one long option string --
|
||
|
e.g. \programopt{-f} and \longprogramopt{file}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-f", "--file", ...)
|
||
|
\end{verbatim}
|
||
|
|
||
|
The interesting stuff, of course, is what comes after the option
|
||
|
strings. In this document, we'll only cover four of the things you
|
||
|
can put there: \var{action}, \var{type}, \var{dest} (destination), and
|
||
|
\var{help}.
|
||
|
|
||
|
\subsubsection{The "store" action\label{optparse-store-action}}
|
||
|
|
||
|
The action tells \module{optparse} what to do when it sees one of the
|
||
|
option strings for this option on the command-line. For example, the
|
||
|
action \var{store} means: take the next argument (or the remainder of
|
||
|
the current argument), ensure that it is of the correct type, and
|
||
|
store it to your chosen destination.
|
||
|
|
||
|
For example, let's fill in the "..." of that last option:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-f", "--file",
|
||
|
action="store", type="string", dest="filename")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Now let's make up a fake command-line and ask \module{optparse} to
|
||
|
parse it:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
args = ["-f", "foo.txt"]
|
||
|
(options, args) = parser.parse_args(args)
|
||
|
\end{verbatim}
|
||
|
|
||
|
(Note that if you don't pass an argument list to
|
||
|
\function{parse_args()}, it automatically uses \var{sys.argv[1:]}.)
|
||
|
|
||
|
When \module{optparse} sees the \programopt{-f}, it sucks in the next
|
||
|
argument -- ``foo.txt'' -- and stores it in the \var{filename}
|
||
|
attribute of a special object. That object is the first return value
|
||
|
from \programopt{parse_args()}, so:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
print options.filename
|
||
|
\end{verbatim}
|
||
|
|
||
|
will print ``foo.txt''.
|
||
|
|
||
|
Other option types supported by \module{optparse} are ``int'' and
|
||
|
``float''. Here's an option that expects an integer argument:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-n", type="int", dest="num")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Note that I didn't supply a long option, which is perfectly acceptable.
|
||
|
I also didn't specify the action -- it defaults to ``store''.
|
||
|
|
||
|
Let's parse another fake command-line. This time, we'll jam the
|
||
|
option argument right up against the option -- \programopt{-n42} (one
|
||
|
argument) is equivalent to \programopt{-n 42} (two arguments). :
|
||
|
|
||
|
\begin{verbatim}
|
||
|
(options, args) = parser.parse_args(["-n42"])
|
||
|
print options.num
|
||
|
\end{verbatim}
|
||
|
|
||
|
will print ``42''.
|
||
|
|
||
|
Trying out the ``float'' type is left as an exercise for the reader.
|
||
|
|
||
|
If you don't specify a type, \module{optparse} assumes ``string''.
|
||
|
Combined with the fact that the default action is ``store'', that
|
||
|
means our first example can be a lot shorter:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-f", "--file", dest="filename")
|
||
|
\end{verbatim}
|
||
|
|
||
|
If you don't supply a destination, \module{optparse} figures out a
|
||
|
sensible default from the option strings: if the first long option
|
||
|
string is \longprogramopt{foo-bar}, then the default destination is
|
||
|
\var{foo_bar}. If there are no long option strings,
|
||
|
\module{optparse} looks at the first short option: the default
|
||
|
destination for \programopt{-f} is \var{f}.
|
||
|
|
||
|
Adding types is fairly easy; please refer to section
|
||
|
\ref{optparse-adding-types}: Adding new types.
|
||
|
|
||
|
\subsubsection{Other "store_*" actions\label{optparse-other-store-actions}}
|
||
|
|
||
|
Flag options -- set a variable to true or false when a particular
|
||
|
option is seen -- are quite common. \module{optparse} supports them
|
||
|
with two separate actions, ``store_true'' and ``store_false''. For
|
||
|
example, you might have a \var{verbose} flag that is turned on with
|
||
|
\programopt{-v} and off with \programopt{-q}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-v", action="store_true", dest="verbose")
|
||
|
parser.add_option("-q", action="store_false", dest="verbose")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Here we have two different options with the same destination, which is
|
||
|
perfectly OK. (It just means you have to be a bit careful when setting
|
||
|
default values -- see below.)
|
||
|
|
||
|
When \module{optparse} sees \programopt{-v} on the command line, it
|
||
|
sets the \var{verbose} attribute of the special {option values}
|
||
|
object to 1; when it sees \programopt{-q}, it sets \var{verbose} to
|
||
|
0.
|
||
|
|
||
|
\subsubsection{Setting default values\label{optparse-setting-default-values}}
|
||
|
|
||
|
All of the above examples involve setting some variable (the
|
||
|
``destination'') when certain command-line options are seen. What
|
||
|
happens if those options are never seen? Since we didn't supply any
|
||
|
defaults, they are all set to None. Sometimes, this is just fine
|
||
|
(which is why it's the default), but sometimes, you want more control.
|
||
|
To address that need, \module{optparse} lets you supply a default
|
||
|
value for each destination, which is assigned before the command-line
|
||
|
is parsed.
|
||
|
|
||
|
First, consider the verbose/quiet example. If we want
|
||
|
\module{optparse} to set \var{verbose} to 1 unless -q is seen, then
|
||
|
we can do this:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-v", action="store_true", dest="verbose", default=1)
|
||
|
parser.add_option("-q", action="store_false", dest="verbose")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Oddly enough, this is exactly equivalent:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-v", action="store_true", dest="verbose")
|
||
|
parser.add_option("-q", action="store_false", dest="verbose", default=1)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Those are equivalent because you're supplying a default value for the
|
||
|
option's \emph{destination}, and these two options happen to have the same
|
||
|
destination (the \var{verbose} variable).
|
||
|
|
||
|
Consider this:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-v", action="store_true", dest="verbose", default=0)
|
||
|
parser.add_option("-q", action="store_false", dest="verbose", default=1)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Again, the default value for \var{verbose} will be 1: the last
|
||
|
default value supplied for any particular destination attribute is the
|
||
|
one that counts.
|
||
|
|
||
|
\subsubsection{Generating help\label{optparse-generating-help}}
|
||
|
|
||
|
The last feature that you will use in every script is
|
||
|
\module{optparse}'s ability to generate help messages. All you have
|
||
|
to do is supply a \var{help} value when you add an option. Let's
|
||
|
create a new parser and populate it with user-friendly (documented)
|
||
|
options:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
usage = "usage: %prog [options] arg1 arg2"
|
||
|
parser = OptionParser(usage=usage)
|
||
|
parser.add_option("-v", "--verbose",
|
||
|
action="store_true", dest="verbose", default=1,
|
||
|
help="make lots of noise [default]")
|
||
|
parser.add_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose",
|
||
|
help="be vewwy quiet (I'm hunting wabbits)")
|
||
|
parser.add_option("-f", "--file", dest="filename",
|
||
|
metavar="FILE", help="write output to FILE"),
|
||
|
parser.add_option("-m", "--mode",
|
||
|
default="intermediate",
|
||
|
help="interaction mode: one of 'novice', "
|
||
|
"'intermediate' [default], 'expert'")
|
||
|
\end{verbatim}
|
||
|
|
||
|
If \module{optparse} encounters either \programopt{-h} or
|
||
|
\longprogramopt{--help} on the command-line, or if you just call
|
||
|
\method{parser.print_help()}, it prints the following to stdout:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
usage: <yourscript> [options] arg1 arg2
|
||
|
|
||
|
options:
|
||
|
-h, --help show this help message and exit
|
||
|
-v, --verbose make lots of noise [default]
|
||
|
-q, --quiet be vewwy quiet (I'm hunting wabbits)
|
||
|
-fFILE, --file=FILE write output to FILE
|
||
|
-mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate'
|
||
|
[default], 'expert'
|
||
|
\end{verbatim}
|
||
|
|
||
|
There's a lot going on here to help \module{optparse} generate the
|
||
|
best possible help message:
|
||
|
|
||
|
\begin{itemize}
|
||
|
\item the script defines its own usage message:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
usage = "usage: %prog [options] arg1 arg2"
|
||
|
\end{verbatim}
|
||
|
|
||
|
\module{optparse} expands "\%prog" in the usage string to the name of the
|
||
|
current script, ie. \code{os.path.basename(sys.argv[0])}. The
|
||
|
expanded string is then printed before the detailed option help.
|
||
|
|
||
|
If you don't supply a usage string, \module{optparse} uses a bland but
|
||
|
sensible default: ``usage: \%prog [options]'', which is fine if your
|
||
|
script doesn't take any positional arguments.
|
||
|
|
||
|
\item every option defines a help string, and doesn't worry about
|
||
|
line-wrapping -- \module{optparse} takes care of wrapping lines and
|
||
|
making the help output look good.
|
||
|
|
||
|
\item options that take a value indicate this fact in their
|
||
|
automatically-generated help message, e.g. for the ``mode'' option:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
-mMODE, --mode=MODE
|
||
|
\end{verbatim}
|
||
|
|
||
|
Here, ``MODE'' is called the meta-variable: it stands for the argument
|
||
|
that the user is expected to supply to
|
||
|
\programopt{-m}/\longprogramopt{mode}. By default, \module{optparse}
|
||
|
converts the destination variable name to uppercase and uses that for
|
||
|
the meta-variable. Sometimes, that's not what you want -- for
|
||
|
example, the \var{filename} option explicitly sets
|
||
|
\code{metavar="FILE"}, resulting in this automatically-generated
|
||
|
option description:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
-fFILE, --file=FILE
|
||
|
\end{verbatim}
|
||
|
|
||
|
This is important for more than just saving space, though: the
|
||
|
manually written help text uses the meta-variable ``FILE'', to clue
|
||
|
the user in that there's a connection between the formal syntax
|
||
|
``-fFILE'' and the informal semantic description ``write output to
|
||
|
FILE''. This is a simple but effective way to make your help text a
|
||
|
lot clearer and more useful for end users.
|
||
|
\end{itemize}
|
||
|
|
||
|
\subsubsection{Print a version number\label{optparse-print-version}}
|
||
|
|
||
|
Similar to the brief usage string, \module{optparse} can also print a
|
||
|
version string for your program. You have to supply the string, as
|
||
|
the \var{version} argument to \class{OptionParser}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser(usage="%prog [-f] [-q]", version="%prog 1.0")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Note that ``\%prog'' is expanded just like it is in \var{usage}. Apart from
|
||
|
that, \var{version} can contain anything you like. When you supply it,
|
||
|
\module{optparse} automatically adds a\ longprogramopt{version} option to your
|
||
|
parser. If it encounters this option on the command line, it expands
|
||
|
your \var{version} string (by replacing ``\%prog''), prints it to
|
||
|
stdout, and exits.
|
||
|
|
||
|
For example, if your script is called /usr/bin/foo, a user might do:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
$ /usr/bin/foo --version
|
||
|
foo 1.0
|
||
|
$
|
||
|
\end{verbatim}
|
||
|
|
||
|
\subsubsection{Error-handling\label{optparse-error-handling}}
|
||
|
|
||
|
The one thing you need to know for basic usage is how
|
||
|
\module{optparse} behaves when it encounters an error on the
|
||
|
command-line -- e.g. \programopt{-n4x} where \programopt{-n} is an
|
||
|
integer-valued option. \module{optparse} prints your usage message to
|
||
|
stderr, followed by a useful and human-readable error message. Then
|
||
|
it terminates (calls \function{sys.exit()}) with a non-zero exit
|
||
|
status.
|
||
|
|
||
|
If you don't like this, subclass \class{OptionParser} and override the
|
||
|
\method{error()} method. See section \ref{optparse-extending}:
|
||
|
Extending \module{optparse}.
|
||
|
|
||
|
\subsubsection{Putting it all together\label{optparse-basic-summary}}
|
||
|
|
||
|
Here's what my \module{optparse}-based scripts usually look like:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
from optparse import OptionParser
|
||
|
|
||
|
[...]
|
||
|
|
||
|
def main ():
|
||
|
usage = "usage: %prog [options] arg"
|
||
|
parser = OptionParser(usage)
|
||
|
parser.add_option("-f", "--file", type="string", dest="filename",
|
||
|
help="read data from FILENAME")
|
||
|
parser.add_option("-v", "--verbose",
|
||
|
action="store_true", dest="verbose")
|
||
|
parser.add_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose")
|
||
|
[... more options ...]
|
||
|
|
||
|
(options, args) = parser.parse_args()
|
||
|
if len(args) != 1:
|
||
|
parser.error("incorrect number of arguments")
|
||
|
|
||
|
if options.verbose:
|
||
|
print "reading %s..." % options.filename
|
||
|
|
||
|
[... go to work ...]
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|
||
|
\end{verbatim}
|
||
|
|
||
|
\subsection{Advanced Usage\label{optparse-advanced-usage}}
|
||
|
|
||
|
This is reference documentation. If you haven't read the basic
|
||
|
documentation in section \ref{optparse-basic-usage}, do so now.
|
||
|
|
||
|
\subsubsection{Creating and populating the parser\label{optparse-creating-the-parser}}
|
||
|
|
||
|
There are several ways to populate the parser with options. One way
|
||
|
is to pass a list of \class{Options} to the \class{OptionParser}
|
||
|
constructor:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser(option_list=[
|
||
|
make_option("-f", "--filename",
|
||
|
action="store", type="string", dest="filename"),
|
||
|
make_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose")])
|
||
|
\end{verbatim}
|
||
|
|
||
|
(As of \module{optparse} 1.3, \function{make_option()} is an alias for
|
||
|
the \class{Option} class, ie. this just calls the \class{Option}
|
||
|
constructor. A future version of \module{optparse} will probably
|
||
|
split \class{Option} into several classes, and
|
||
|
\function{make_option()} will become a factory function that picks the
|
||
|
right class to instantiate.)
|
||
|
|
||
|
For long option lists, it's often more convenient/readable to create the
|
||
|
list separately:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
option_list = [make_option("-f", "--filename",
|
||
|
action="store", type="string", dest="filename"),
|
||
|
# ... 17 other options ...
|
||
|
make_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose")]
|
||
|
parser = OptionParser(option_list=option_list)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Or, you can use the \method{add_option()} method of
|
||
|
\class{OptionParser} to add options one-at-a-time:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser()
|
||
|
parser.add_option("-f", "--filename",
|
||
|
action="store", type="string", dest="filename")
|
||
|
parser.add_option("-q", "--quiet",
|
||
|
action="store_false", dest="verbose")
|
||
|
\end{verbatim}
|
||
|
|
||
|
This method makes it easier to track down exceptions raised by the
|
||
|
\class{Option} constructor, which are common because of the complicated
|
||
|
interdependencies among the various keyword arguments -- if you get it
|
||
|
wrong, \module{optparse} raises \exception{OptionError}.
|
||
|
|
||
|
\method{add_option()} can be called in one of two ways:
|
||
|
|
||
|
\begin{itemize}
|
||
|
\item pass it an \class{Option} instance (as returned by \function{make_option()})
|
||
|
\item pass it any combination of positional and keyword arguments that
|
||
|
are acceptable to \function{make_option()} (ie., to the \class{Option}
|
||
|
constructor), and it will create the \class{Option} instance for you
|
||
|
(shown above).
|
||
|
\end{itemize}
|
||
|
|
||
|
\subsubsection{Defining options\label{optparse-defining-options}}
|
||
|
|
||
|
Each \class{Option} instance represents a set of synonymous
|
||
|
command-line options, ie. options that have the same meaning and
|
||
|
effect, but different spellings. You can specify any number of short
|
||
|
or long option strings, but you must specify at least one option
|
||
|
string.
|
||
|
|
||
|
To define an option with only a short option string:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-f", ...)
|
||
|
\end{verbatim}
|
||
|
|
||
|
And to define an option with only a long option string:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("--foo", ...)
|
||
|
\end{verbatim}
|
||
|
|
||
|
The ``...'' represents a set of keyword arguments that define
|
||
|
attributes of the \class{Option} object. Just which keyword args you
|
||
|
must supply for a given \class{Option} is fairly complicated (see the
|
||
|
various \method{_check_*()} methods in the \class{Option} class if you
|
||
|
don't believe me), but you always have to supply \emph{some}. If you
|
||
|
get it wrong, \module{optparse} raises an \exception{OptionError}
|
||
|
exception explaining your mistake.
|
||
|
|
||
|
The most important attribute of an option is its action, ie. what to do
|
||
|
when we encounter this option on the command-line. The possible actions
|
||
|
are:
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{store} [default]
|
||
|
store this option's argument.
|
||
|
\term{store_const}
|
||
|
store a constant value.
|
||
|
\term{store_true}
|
||
|
store a true value.
|
||
|
\term{store_false}
|
||
|
store a false value.
|
||
|
\term{append}
|
||
|
append this option's argument to a list.
|
||
|
\term{count}
|
||
|
increment a counter by one.
|
||
|
\term{callback}
|
||
|
call a specified function.
|
||
|
\term{help}
|
||
|
print a usage message including all options and the documentation for
|
||
|
them.
|
||
|
\end{definitions}
|
||
|
|
||
|
(If you don't supply an action, the default is ``store''. For this
|
||
|
action, you may also supply \var{type} and \var{dest} keywords; see
|
||
|
below.)
|
||
|
|
||
|
As you can see, most actions involve storing or updating a value
|
||
|
somewhere. \module{optparse} always creates a particular object (an
|
||
|
instance of the \class{Values} class) specifically for this
|
||
|
purpose. Option arguments (and various other values) are stored as
|
||
|
attributes of this object, according to the \var{dest} (destination)
|
||
|
argument to \function{make_option()}/\method{add_option()}.
|
||
|
|
||
|
For example, when you call:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.parse_args()
|
||
|
\end{verbatim}
|
||
|
|
||
|
one of the first things \module{optparse} does is create a
|
||
|
\var{values} object:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values = Values()
|
||
|
\end{verbatim}
|
||
|
|
||
|
If one of the options in this parser is defined with:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-f", "--file", action="store", type="string", dest="filename")
|
||
|
\end{verbatim}
|
||
|
|
||
|
and the command-line being parsed includes any of the following:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
-ffoo
|
||
|
-f foo
|
||
|
--file=foo
|
||
|
--file foo
|
||
|
\end{verbatim}
|
||
|
|
||
|
then \module{optparse}, on seeing the \programopt{-f} or
|
||
|
\longprogramopt{file} option, will do the equivalent of this:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.filename = "foo"
|
||
|
\end{verbatim}
|
||
|
|
||
|
Clearly, the \var{type} and \var{dest} arguments are (usually) almost
|
||
|
as important as \var{action}. \var{action} is the only attribute that
|
||
|
is meaningful for *all* options, though, so it is the most important.
|
||
|
|
||
|
\subsubsection{Option actions\label{optparse-option-actions}}
|
||
|
|
||
|
The various option actions all have slightly different requirements
|
||
|
and effects. Except for the ``help'' action, you must supply at least
|
||
|
one other keyword argument when creating the \class{Option}; the exact
|
||
|
requirements for each action are listed here.
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{store} [relevant: \var{type}, \var{dest}, \var{nargs}, \var{choices}]
|
||
|
|
||
|
The option must be followed by an argument, which is converted to a
|
||
|
value according to \var{type} and stored in \var{dest}. If
|
||
|
\var{nargs} > 1, multiple arguments will be consumed from the command
|
||
|
line; all will be converted according to \var{type} and stored to
|
||
|
\var{dest} as a tuple. See section \ref{optparse-option-types}:
|
||
|
Option types below.
|
||
|
|
||
|
If \var{choices} is supplied (a list or tuple of strings), the type
|
||
|
defaults to ``choice''.
|
||
|
|
||
|
If \var{type} is not supplied, it defaults to ``string''.
|
||
|
|
||
|
If \var{dest} is not supplied, \module{optparse} derives a
|
||
|
destination from the first long option strings (e.g.,
|
||
|
\longprogramopt{foo-bar} -> \var{foo_bar}). If there are no long
|
||
|
option strings, \module{optparse} derives a destination from the first
|
||
|
short option string (e.g., \programopt{-f} -> \var{f}).
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-f")
|
||
|
make_option("-p", type="float", nargs=3, dest="point")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Given the following command line:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
-f foo.txt -p 1 -3.5 4 -fbar.txt
|
||
|
\end{verbatim}
|
||
|
|
||
|
\module{optparse} will set:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.f = "bar.txt"
|
||
|
values.point = (1.0, -3.5, 4.0)
|
||
|
\end{verbatim}
|
||
|
|
||
|
(Actually, \member{values.f} will be set twice, but only the second
|
||
|
time is visible in the end.)
|
||
|
|
||
|
\term{store_const} [required: \var{const}, \var{dest}]
|
||
|
|
||
|
The \var{const} value supplied to the \class{Option} constructor is
|
||
|
stored in \var{dest}.
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-q", "--quiet",
|
||
|
action="store_const", const=0, dest="verbose"),
|
||
|
make_option("-v", "--verbose",
|
||
|
action="store_const", const=1, dest="verbose"),
|
||
|
make_option(None, "--noisy",
|
||
|
action="store_const", const=2, dest="verbose"),
|
||
|
\end{verbatim}
|
||
|
|
||
|
If \longprogramopt{noisy} is seen, \module{optparse} will set:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.verbose = 2
|
||
|
\end{verbatim}
|
||
|
|
||
|
\term{store_true} [required: \var{dest}]
|
||
|
|
||
|
A special case of ``store_const'' that stores a true value
|
||
|
(specifically, the integer 1) to \var{dest}.
|
||
|
|
||
|
\term{store_false} [required: \var{dest}]
|
||
|
|
||
|
Like ``store_true'', but stores a false value (the integer 0).
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option(None, "--clobber", action="store_true", dest="clobber")
|
||
|
make_option(None, "--no-clobber", action="store_false", dest="clobber")
|
||
|
\end{verbatim}
|
||
|
|
||
|
\term{append} [relevant: \var{type}, \var{dest}, \var{nargs}, \var{choices}]
|
||
|
|
||
|
The option must be followed by an argument, which is appended to the
|
||
|
list in \var{dest}. If no default value for \var{dest} is supplied
|
||
|
(ie. the default is None), an empty list is automatically created when
|
||
|
\module{optparse} first encounters this option on the command-line.
|
||
|
If \samp{nargs > 1}, multiple arguments are consumed, and a tuple of
|
||
|
length \var{nargs} is appended to \var{dest}.
|
||
|
|
||
|
The defaults for \var{type} and \var{dest} are the same as for the
|
||
|
``store'' action.
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-t", "--tracks", action="append", type="int")
|
||
|
\end{verbatim}
|
||
|
|
||
|
If \programopt{-t3} is seen on the command-line, \module{optparse} does the equivalent of:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.tracks = []
|
||
|
values.tracks.append(int("3"))
|
||
|
\end{verbatim}
|
||
|
|
||
|
If, a little later on, \samp{--tracks=4} is seen, it does:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.tracks.append(int("4"))
|
||
|
\end{verbatim}
|
||
|
|
||
|
See Error handling (section \ref{optparse-error-handling}) for
|
||
|
information on how \module{optparse} deals with something like
|
||
|
\samp{--tracks=x}.
|
||
|
|
||
|
\term{count} [required: \var{dest}]
|
||
|
|
||
|
Increment the integer stored at \var{dest}. \var{dest} is set to zero
|
||
|
before being incremented the first time (unless you supply a default
|
||
|
value).
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
make_option("-v", action="count", dest="verbosity")
|
||
|
\end{verbatim}
|
||
|
|
||
|
The first time \programopt{-v} is seen on the command line,
|
||
|
\module{optparse} does the equivalent of:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.verbosity = 0
|
||
|
values.verbosity += 1
|
||
|
\end{verbatim}
|
||
|
|
||
|
Every subsequent occurrence of \programopt{-v} results in:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.verbosity += 1
|
||
|
\end{verbatim}
|
||
|
|
||
|
\term{callback} [required: \var{'callback'};
|
||
|
relevant: \var{type}, \var{nargs}, \var{callback_args},
|
||
|
\var{callback_kwargs}]
|
||
|
|
||
|
Call the function specified by \var{callback}. The signature of
|
||
|
this function should be:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
func(option : Option,
|
||
|
opt : string,
|
||
|
value : any,
|
||
|
parser : OptionParser,
|
||
|
*args, **kwargs)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Callback options are covered in detail in section
|
||
|
\ref{optparse-callback-options}: Callback Options.
|
||
|
|
||
|
\term{help} [required: none]
|
||
|
|
||
|
Prints a complete help message for all the options in the current
|
||
|
option parser. The help message is constructed from the \var{usage}
|
||
|
string passed to \class{OptionParser}'s constructor and the \var{help}
|
||
|
string passed to every option.
|
||
|
|
||
|
If no \var{help} string is supplied for an option, it will still be
|
||
|
listed in the help message. To omit an option entirely, use the
|
||
|
special value \constant{optparse.SUPPRESS_HELP}.
|
||
|
|
||
|
Example:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
from optparse import Option, OptionParser, SUPPRESS_HELP
|
||
|
|
||
|
usage = "usage: %prog [options]"
|
||
|
parser = OptionParser(usage, option_list=[
|
||
|
make_option("-h", "--help", action="help"),
|
||
|
make_option("-v", action="store_true", dest="verbose",
|
||
|
help="Be moderately verbose")
|
||
|
make_option("--file", dest="filename",
|
||
|
help="Input file to read data from"),
|
||
|
make_option("--secret", help=SUPPRESS_HELP)
|
||
|
\end{verbatim}
|
||
|
|
||
|
If \module{optparse} sees either \longprogramopt{-h} or \longprogramopt{help} on
|
||
|
the command line, it will print something like the following help
|
||
|
message to stdout:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
usage: <yourscript> [options]
|
||
|
|
||
|
options:
|
||
|
-h, --help Show this help message and exit
|
||
|
-v Be moderately verbose
|
||
|
--file=FILENAME Input file to read data from
|
||
|
\end{verbatim}
|
||
|
|
||
|
After printing the help message, \module{optparse} terminates your process
|
||
|
with \code{sys.exit(0)}.
|
||
|
|
||
|
\term{version} [required: none]
|
||
|
|
||
|
Prints the version number supplied to the \class{OptionParser} to
|
||
|
stdout and exits. The version number is actually formatted and
|
||
|
printed by the \method{print_version()} method of
|
||
|
\class{OptionParser}. Generally only relevant if the \var{version}
|
||
|
argument is supplied to the \class{OptionParser} constructor.
|
||
|
\end{definitions}
|
||
|
|
||
|
\subsubsection{Option types\label{optparse-option-types}}
|
||
|
|
||
|
\module{optparse} supports six option types out of the box: \dfn{string},
|
||
|
\dfn{int}, \dfn{long}, \dfn{choice}, \dfn{float} and \dfn{complex}.
|
||
|
(Of these, string, int, float, and choice are the most commonly used
|
||
|
-- long and complex are there mainly for completeness.) It's easy to
|
||
|
add new option types by subclassing the \class{Option} class; see
|
||
|
section \ref{optparse-extending}: Extending \module{optparse}.
|
||
|
|
||
|
Arguments to string options are not checked or converted in any way:
|
||
|
the text on the command line is stored in the destination (or passed
|
||
|
to the callback) as-is.
|
||
|
|
||
|
Integer arguments are passed to \function{int()} to convert them to
|
||
|
Python integers. If \function{int()} fails, so will
|
||
|
\module{optparse}, although with a more useful error message.
|
||
|
Internally, \module{optparse} raises \exception{OptionValueError} in
|
||
|
\function{optparse.check_builtin()}; at a higher level (in
|
||
|
\class{OptionParser}) this is caught and \module{optparse} terminates
|
||
|
your program with a useful error message.
|
||
|
|
||
|
Likewise, float arguments are passed to \function{float()} for
|
||
|
conversion, long arguments to \function{long()}, and complex arguments
|
||
|
to \function{complex()}. Apart from that, they are handled
|
||
|
identically to integer arguments.
|
||
|
|
||
|
Choice options are a subtype of string options. A master list or
|
||
|
tuple of choices (strings) must be passed to the option constructor
|
||
|
(\function{make_option()} or \method{OptionParser.add_option()}) as
|
||
|
the ``choices'' keyword argument. Choice option arguments are
|
||
|
compared against this master list in
|
||
|
\function{optparse.check_choice()}, and \exception{OptionValueError}
|
||
|
is raised if an unknown string is given.
|
||
|
|
||
|
\subsubsection{Querying and manipulating your option parser\label{optparse-querying-and-manipulating}}
|
||
|
|
||
|
Sometimes, it's useful to poke around your option parser and see what's
|
||
|
there. \class{OptionParser} provides a couple of methods to help you out:
|
||
|
|
||
|
\begin{methoddesc}{has_option}{opt_str}
|
||
|
Given an option string such as \programopt{-q} or
|
||
|
\longprogramopt{verbose}, returns true if the \class{OptionParser}
|
||
|
has an option with that option string.
|
||
|
\end{methoddesc}
|
||
|
|
||
|
\begin{methoddesc}{get_option}{opt_str}
|
||
|
Returns the \class{Option} instance that implements the option
|
||
|
string you supplied, or None if no options implement it.
|
||
|
\end{methoddesc}
|
||
|
|
||
|
\begin{methoddesc}{remove_option}{opt_str}
|
||
|
If the \class{OptionParser} has an option corresponding to
|
||
|
\var{opt_str}, that option is removed. If that option provided
|
||
|
any other option strings, all of those option strings become
|
||
|
invalid.
|
||
|
|
||
|
If \var{opt_str} does not occur in any option belonging to this
|
||
|
\class{OptionParser}, raises \exception{ValueError}.
|
||
|
\end{methoddesc}
|
||
|
|
||
|
\subsubsection{Conflicts between options\label{optparse-conflicts}}
|
||
|
|
||
|
If you're not careful, it's easy to define conflicting options:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-n", "--dry-run", ...)
|
||
|
[...]
|
||
|
parser.add_option("-n", "--noisy", ...)
|
||
|
\end{verbatim}
|
||
|
|
||
|
(This is even easier to do if you've defined your own
|
||
|
\class{OptionParser} subclass with some standard options.)
|
||
|
|
||
|
On the assumption that this is usually a mistake, \module{optparse}
|
||
|
1.2 and later raise an exception (\exception{OptionConflictError}) by
|
||
|
default when this happens. Since this is an easily-fixed programming
|
||
|
error, you shouldn't try to catch this exception -- fix your mistake
|
||
|
and get on with life.
|
||
|
|
||
|
Sometimes, you want newer options to deliberately replace the option
|
||
|
strings used by older options. You can achieve this by calling:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.set_conflict_handler("resolve")
|
||
|
\end{verbatim}
|
||
|
|
||
|
which instructs \module{optparse} to resolve option conflicts
|
||
|
intelligently.
|
||
|
|
||
|
Here's how it works: every time you add an option, \module{optparse}
|
||
|
checks for conflicts with previously-added options. If it finds any,
|
||
|
it invokes the conflict-handling mechanism you specify either to the
|
||
|
\class{OptionParser} constructor:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser(..., conflict_handler="resolve")
|
||
|
\end{verbatim}
|
||
|
|
||
|
or via the \method{set_conflict_handler()} method.
|
||
|
|
||
|
The default conflict-handling mechanism is ``error''. The only other
|
||
|
one is ``ignore'', which restores the (arguably broken) behaviour of
|
||
|
\module{optparse} 1.1 and earlier.
|
||
|
|
||
|
Here's an example: first, define an \class{OptionParser} set to
|
||
|
resolve conflicts intelligently:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser(conflict_handler="resolve")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Now add all of our options:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-n", "--dry-run", ..., help="original dry-run option")
|
||
|
[...]
|
||
|
parser.add_option("-n", "--noisy", ..., help="be noisy")
|
||
|
\end{verbatim}
|
||
|
|
||
|
At this point, \module{optparse} detects that a previously-added option is already
|
||
|
using the \programopt{-n} option string. Since \code{conflict_handler
|
||
|
== "resolve"}, it resolves the situation by removing \programopt{-n}
|
||
|
from the earlier option's list of option strings. Now,
|
||
|
\longprogramopt{dry-run} is the only way for the user to activate that
|
||
|
option. If the user asks for help, the help message will reflect
|
||
|
that, e.g.:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
options:
|
||
|
--dry-run original dry-run option
|
||
|
[...]
|
||
|
-n, --noisy be noisy
|
||
|
\end{verbatim}
|
||
|
|
||
|
Note that it's possible to whittle away the option strings for a
|
||
|
previously-added option until there are none left, and the user has no
|
||
|
way of invoking that option from the command-line. In that case,
|
||
|
\module{optparse} removes that option completely, so it doesn't show
|
||
|
up in help text or anywhere else. E.g. if we carry on with our
|
||
|
existing \class{OptionParser}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("--dry-run", ..., help="new dry-run option")
|
||
|
\end{verbatim}
|
||
|
|
||
|
At this point, the first \programopt{-n}/\longprogramopt{dry-run}
|
||
|
option is no longer accessible, so \module{optparse} removes it. If
|
||
|
the user asks for help, they'll get something like this:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
options:
|
||
|
[...]
|
||
|
-n, --noisy be noisy
|
||
|
--dry-run new dry-run option
|
||
|
\end{verbatim}
|
||
|
|
||
|
\subsection{Callback Options\label{optparse-callback-options}}
|
||
|
|
||
|
If \module{optparse}'s built-in actions and types just don't fit the
|
||
|
bill for you, but it's not worth extending \module{optparse} to define
|
||
|
your own actions or types, you'll probably need to define a callback
|
||
|
option. Defining callback options is quite easy; the tricky part is
|
||
|
writing a good callback (the function that is called when
|
||
|
\module{optparse} encounters the option on the command line).
|
||
|
|
||
|
\subsubsection{Defining a callback option\label{optparse-defining-callback-option}}
|
||
|
|
||
|
As always, you can define a callback option either by directly
|
||
|
instantiating the \class{Option} class, or by using the
|
||
|
\method{add_option()} method of your \class{OptionParser} object. The
|
||
|
only option attribute you must specify is \var{callback}, the function
|
||
|
to call:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser.add_option("-c", callback=my_callback)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Note that you supply a function object here -- so you must have
|
||
|
already defined a function \function{my_callback()} when you define
|
||
|
the callback option. In this simple case, \module{optparse} knows
|
||
|
nothing about the arguments the \programopt{-c} option expects to
|
||
|
take. Usually, this means that the option doesn't take any arguments
|
||
|
-- the mere presence of \programopt{-c} on the command-line is all it
|
||
|
needs to know. In some circumstances, though, you might want your
|
||
|
callback to consume an arbitrary number of command-line arguments.
|
||
|
This is where writing callbacks gets tricky; it's covered later in
|
||
|
this document.
|
||
|
|
||
|
There are several other option attributes that you can supply when you
|
||
|
define an option attribute:
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{type}
|
||
|
has its usual meaning: as with the ``store'' or ``append'' actions, it
|
||
|
instructs \module{optparse} to consume one argument that must be
|
||
|
convertible to \var{type}. Rather than storing the value(s) anywhere,
|
||
|
though, \module{optparse} converts it to \var{type} and passes it to
|
||
|
your callback function.
|
||
|
|
||
|
\term{nargs}
|
||
|
also has its usual meaning: if it is supplied and \samp{nargs > 1},
|
||
|
\module{optparse} will consume \var{nargs} arguments, each of which
|
||
|
must be convertible to \var{type}. It then passes a tuple of
|
||
|
converted values to your callback.
|
||
|
|
||
|
\term{callback_args}
|
||
|
a tuple of extra positional arguments to pass to the callback.
|
||
|
|
||
|
\term{callback_kwargs}
|
||
|
a dictionary of extra keyword arguments to pass to the callback.
|
||
|
\end{definitions}
|
||
|
|
||
|
\subsubsection{How callbacks are called\label{optparse-callbacks-called}}
|
||
|
|
||
|
All callbacks are called as follows:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
func(option, opt, value, parser, *args, **kwargs)
|
||
|
\end{verbatim}
|
||
|
|
||
|
where
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{option}
|
||
|
is the \class{Option} instance that's calling the callback.
|
||
|
|
||
|
\term{opt}
|
||
|
is the option string seen on the command-line that's triggering the
|
||
|
callback. (If an abbreviated long option was used, \var{opt} will be
|
||
|
the full, canonical option string -- e.g. if the user puts
|
||
|
\longprogramopt{foo} on the command-line as an abbreviation for
|
||
|
\longprogramopt{foobar}, then \var{opt} will be
|
||
|
\longprogramopt{foobar}.)
|
||
|
|
||
|
\term{value}
|
||
|
is the argument to this option seen on the command-line.
|
||
|
\module{optparse} will only expect an argument if \var{type} is
|
||
|
set; the type of \var{value} will be the type implied by the
|
||
|
option's type (see \ref{optparse-option-types}: Option types). If
|
||
|
\var{type} for this option is None (no argument expected), then
|
||
|
\var{value} will be None. If \samp{nargs > 1}, \var{value} will
|
||
|
be a tuple of values of the appropriate type.
|
||
|
|
||
|
\term{parser}
|
||
|
is the \class{OptionParser} instance driving the whole thing, mainly
|
||
|
useful because you can access some other interesting data through it,
|
||
|
as instance attributes:
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{parser.rargs}
|
||
|
the current remaining argument list, ie. with \var{opt} (and
|
||
|
\var{value}, if any) removed, and only the arguments following
|
||
|
them still there. Feel free to modify \member{parser.rargs},
|
||
|
e.g. by consuming more arguments.
|
||
|
|
||
|
\term{parser.largs}
|
||
|
the current set of leftover arguments, ie. arguments that have been
|
||
|
processed but have not been consumed as options (or arguments to
|
||
|
options). Feel free to modify \member{parser.largs} e.g. by adding
|
||
|
more arguments to it.
|
||
|
|
||
|
\term{parser.values}
|
||
|
the object where option values are by default stored. This is useful
|
||
|
because it lets callbacks use the same mechanism as the rest of
|
||
|
\module{optparse} for storing option values; you don't need to mess
|
||
|
around with globals or closures. You can also access the value(s) of
|
||
|
any options already encountered on the command-line.
|
||
|
\end{definitions}
|
||
|
|
||
|
\term{args}
|
||
|
is a tuple of arbitrary positional arguments supplied via the
|
||
|
\var{callback}_args option attribute.
|
||
|
|
||
|
\term{kwargs}
|
||
|
is a dictionary of arbitrary keyword arguments supplied via
|
||
|
\var{callback_kwargs}.
|
||
|
\end{definitions}
|
||
|
|
||
|
Since \var{args} and \var{kwargs} are optional (they are only passed
|
||
|
if you supply \var{callback_args} and/or \var{callback_kwargs} when
|
||
|
you define your callback option), the minimal callback function is:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def my_callback (option, opt, value, parser):
|
||
|
pass
|
||
|
\end{verbatim}
|
||
|
|
||
|
\subsubsection{Error handling\label{optparse-callback-error-handling}}
|
||
|
|
||
|
The callback function should raise \exception{OptionValueError} if
|
||
|
there are any problems with the option or its
|
||
|
argument(s). \module{optparse} catches this and terminates the
|
||
|
program, printing the error message you supply to stderr. Your
|
||
|
message should be clear, concise, accurate, and mention the option at
|
||
|
fault. Otherwise, the user will have a hard time figuring out what he
|
||
|
did wrong.
|
||
|
|
||
|
\subsubsection{Examples\label{optparse-callback-examples}}
|
||
|
|
||
|
Here's an example of a callback option that takes no arguments, and
|
||
|
simply records that the option was seen:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def record_foo_seen (option, opt, value, parser):
|
||
|
parser.saw_foo = 1
|
||
|
|
||
|
parser.add_option("--foo", action="callback", callback=record_foo_seen)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Of course, you could do that with the ``store_true'' action. Here's a
|
||
|
slightly more interesting example: record the fact that
|
||
|
\programopt{-a} is seen, but blow up if it comes after \programopt{-b}
|
||
|
in the command-line.
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def check_order (option, opt, value, parser):
|
||
|
if parser.values.b:
|
||
|
raise OptionValueError("can't use -a after -b")
|
||
|
parser.values.a = 1
|
||
|
[...]
|
||
|
parser.add_option("-a", action="callback", callback=check_order)
|
||
|
parser.add_option("-b", action="store_true", dest="b")
|
||
|
\end{verbatim}
|
||
|
|
||
|
If you want to reuse this callback for several similar options (set a
|
||
|
flag, but blow up if \programopt{-b} has already been seen), it needs
|
||
|
a bit of work: the error message and the flag that it sets must be
|
||
|
generalized.
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def check_order (option, opt, value, parser):
|
||
|
if parser.values.b:
|
||
|
raise OptionValueError("can't use %s after -b" % opt)
|
||
|
setattr(parser.values, option.dest, 1)
|
||
|
[...]
|
||
|
parser.add_option("-a", action="callback", callback=check_order, dest='a')
|
||
|
parser.add_option("-b", action="store_true", dest="b")
|
||
|
parser.add_option("-c", action="callback", callback=check_order, dest='c')
|
||
|
\end{verbatim}
|
||
|
|
||
|
Of course, you could put any condition in there -- you're not limited
|
||
|
to checking the values of already-defined options. For example, if
|
||
|
you have options that should not be called when the moon is full, all
|
||
|
you have to do is this:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def check_moon (option, opt, value, parser):
|
||
|
if is_full_moon():
|
||
|
raise OptionValueError("%s option invalid when moon full" % opt)
|
||
|
setattr(parser.values, option.dest, 1)
|
||
|
[...]
|
||
|
parser.add_option("--foo",
|
||
|
action="callback", callback=check_moon, dest="foo")
|
||
|
\end{verbatim}
|
||
|
|
||
|
(The definition of is_full_moon() is left as an exercise for the
|
||
|
reader.)
|
||
|
|
||
|
\strong{Fixed arguments}
|
||
|
|
||
|
Things get slightly more interesting when you define callback options
|
||
|
that take a fixed number of arguments. Specifying that a callback
|
||
|
option takes arguments is similar to defining a ``store'' or
|
||
|
``append'' option: if you define \var{type}, then the option takes one
|
||
|
argument that must be convertible to that type; if you further define
|
||
|
\var{nargs}, then the option takes that many arguments.
|
||
|
|
||
|
Here's an example that just emulates the standard ``store'' action:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def store_value (option, opt, value, parser):
|
||
|
setattr(parser.values, option.dest, value)
|
||
|
[...]
|
||
|
parser.add_option("--foo",
|
||
|
action="callback", callback=store_value,
|
||
|
type="int", nargs=3, dest="foo")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Note that \module{optparse} takes care of consuming 3 arguments and
|
||
|
converting them to integers for you; all you have to do is store them.
|
||
|
(Or whatever: obviously you don't need a callback for this example.
|
||
|
Use your imagination!)
|
||
|
|
||
|
\strong{Variable arguments}
|
||
|
|
||
|
Things get hairy when you want an option to take a variable number of
|
||
|
arguments. For this case, you have to write a callback;
|
||
|
\module{optparse} doesn't provide any built-in capabilities for it.
|
||
|
You have to deal with the full-blown syntax for conventional Unix
|
||
|
command-line parsing. (Previously, \module{optparse} took care of
|
||
|
this for you, but I got it wrong. It was fixed at the cost of making
|
||
|
this kind of callback more complex.) In particular, callbacks have to
|
||
|
worry about bare \longprogramopt{} and \programopt{-} arguments; the
|
||
|
convention is:
|
||
|
|
||
|
\begin{itemize}
|
||
|
\item bare \longprogramopt{}, if not the argument to some option,
|
||
|
causes command-line processing to halt and the \longprogramopt{}
|
||
|
itself is lost.
|
||
|
|
||
|
\item bare \programopt{-} similarly causes command-line processing to
|
||
|
halt, but the \programopt{-} itself is kept.
|
||
|
|
||
|
\item either \longprogramopt{} or \programopt{-} can be option
|
||
|
arguments.
|
||
|
\end{itemize}
|
||
|
|
||
|
If you want an option that takes a variable number of arguments, there
|
||
|
are several subtle, tricky issues to worry about. The exact
|
||
|
implementation you choose will be based on which trade-offs you're
|
||
|
willing to make for your application (which is why \module{optparse}
|
||
|
doesn't support this sort of thing directly).
|
||
|
|
||
|
Nevertheless, here's a stab at a callback for an option with variable
|
||
|
arguments:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def varargs (option, opt, value, parser):
|
||
|
assert value is None
|
||
|
done = 0
|
||
|
value = []
|
||
|
rargs = parser.rargs
|
||
|
while rargs:
|
||
|
arg = rargs[0]
|
||
|
|
||
|
# Stop if we hit an arg like "--foo", "-a", "-fx", "--file=f",
|
||
|
# etc. Note that this also stops on "-3" or "-3.0", so if
|
||
|
# your option takes numeric values, you will need to handle
|
||
|
# this.
|
||
|
if ((arg[:2] == "--" and len(arg) > 2) or
|
||
|
(arg[:1] == "-" and len(arg) > 1 and arg[1] != "-")):
|
||
|
break
|
||
|
else:
|
||
|
value.append(arg)
|
||
|
del rargs[0]
|
||
|
|
||
|
setattr(parser.values, option.dest, value)
|
||
|
|
||
|
[...]
|
||
|
parser.add_option("-c", "--callback",
|
||
|
action="callback", callback=varargs)
|
||
|
\end{verbatim}
|
||
|
|
||
|
The main weakness with this particular implementation is that negative
|
||
|
numbers in the arguments following \programopt{-c} will be interpreted
|
||
|
as further options, rather than as arguments to \programopt{-c}.
|
||
|
Fixing this is left as an exercise for the reader.
|
||
|
|
||
|
\subsection{Extending \module{optparse}\label{optparse-extending}}
|
||
|
|
||
|
Since the two major controlling factors in how \module{optparse}
|
||
|
interprets command-line options are the action and type of each
|
||
|
option, the most likely direction of extension is to add new actions
|
||
|
and new types.
|
||
|
|
||
|
Also, the examples section includes several demonstrations of
|
||
|
extending \module{optparse} in different ways: eg. a case-insensitive
|
||
|
option parser, or two kinds of option parsers that implement
|
||
|
``required options''.
|
||
|
|
||
|
\subsubsection{Adding new types\label{optparse-adding-types}}
|
||
|
|
||
|
To add new types, you need to define your own subclass of
|
||
|
\module{optparse}'s \class{Option} class. This class has a couple of
|
||
|
attributes that define \module{optparse}'s types: \member{TYPES} and
|
||
|
\member{TYPE_CHECKER}.
|
||
|
|
||
|
\member{TYPES} is a tuple of type names; in your subclass, simply
|
||
|
define a new tuple \member{TYPES} that builds on the standard one.
|
||
|
|
||
|
\member{TYPE_CHECKER} is a dictionary mapping type names to
|
||
|
type-checking functions. A type-checking function has the following
|
||
|
signature:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def check_foo (option : Option, opt : string, value : string)
|
||
|
-> foo
|
||
|
\end{verbatim}
|
||
|
|
||
|
You can name it whatever you like, and make it return any type you
|
||
|
like. The value returned by a type-checking function will wind up in
|
||
|
the \class{OptionValues} instance returned by
|
||
|
\method{OptionParser.parse_args()}, or be passed to callbacks as the
|
||
|
\var{value} parameter.
|
||
|
|
||
|
Your type-checking function should raise \exception{OptionValueError}
|
||
|
if it encounters any problems. \exception{OptionValueError} takes a
|
||
|
single string argument, which is passed as-is to
|
||
|
\class{OptionParser}'s \method{error()} method, which in turn prepends
|
||
|
the program name and the string ``error:'' and prints everything to
|
||
|
stderr before terminating the process.
|
||
|
|
||
|
Here's a silly example that demonstrates adding a ``complex'' option
|
||
|
type to parse Python-style complex numbers on the command line. (This
|
||
|
is even sillier than it used to be, because \module{optparse} 1.3 adds
|
||
|
built-in support for complex numbers [purely for completeness], but
|
||
|
never mind.)
|
||
|
|
||
|
First, the necessary imports:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
from copy import copy
|
||
|
from optparse import Option, OptionValueError
|
||
|
\end{verbatim}
|
||
|
|
||
|
You need to define your type-checker first, since it's referred to
|
||
|
later (in the \member{TYPE_CHECKER} class attribute of your
|
||
|
\class{Option} subclass):
|
||
|
|
||
|
\begin{verbatim}
|
||
|
def check_complex (option, opt, value):
|
||
|
try:
|
||
|
return complex(value)
|
||
|
except ValueError:
|
||
|
raise OptionValueError(
|
||
|
"option %s: invalid complex value: %r" % (opt, value))
|
||
|
\end{verbatim}
|
||
|
|
||
|
Finally, the \class{Option} subclass:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
class MyOption (Option):
|
||
|
TYPES = Option.TYPES + ("complex",)
|
||
|
TYPE_CHECKER = copy(Option.TYPE_CHECKER)
|
||
|
TYPE_CHECKER["complex"] = check_complex
|
||
|
\end{verbatim}
|
||
|
|
||
|
(If we didn't make a \function{copy()} of
|
||
|
\member{Option.TYPE_CHECKER}, we would end up modifying the
|
||
|
\member{TYPE_CHECKER} attribute of \module{optparse}'s Option class.
|
||
|
This being Python, nothing stops you from doing that except good
|
||
|
manners and common sense.)
|
||
|
|
||
|
That's it! Now you can write a script that uses the new option type
|
||
|
just like any other \module{optparse}-based script, except you have to
|
||
|
instruct your \class{OptionParser} to use \class{MyOption} instead of
|
||
|
\class{Option}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
parser = OptionParser(option_class=MyOption)
|
||
|
parser.add_option("-c", action="store", type="complex", dest="c")
|
||
|
\end{verbatim}
|
||
|
|
||
|
Alternately, you can build your own option list and pass it to
|
||
|
\class{OptionParser}; if you don't use \method{add_option()} in the
|
||
|
above way, you don't need to tell \class{OptionParser} which option
|
||
|
class to use:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
option_list = [MyOption("-c", action="store", type="complex", dest="c")]
|
||
|
parser = OptionParser(option_list=option_list)
|
||
|
\end{verbatim}
|
||
|
|
||
|
\subsubsection{Adding new actions\label{optparse-adding-actions}}
|
||
|
|
||
|
Adding new actions is a bit trickier, because you have to understand
|
||
|
that \module{optparse} has a couple of classifications for actions:
|
||
|
|
||
|
\begin{definitions}
|
||
|
\term{"store" actions}
|
||
|
actions that result in \module{optparse} storing a value to an attribute
|
||
|
of the OptionValues instance; these options require a 'dest'
|
||
|
attribute to be supplied to the Option constructor
|
||
|
\term{"typed" actions}
|
||
|
actions that take a value from the command line and expect it to be
|
||
|
of a certain type; or rather, a string that can be converted to a
|
||
|
certain type. These options require a 'type' attribute to the
|
||
|
Option constructor.
|
||
|
\end{definitions}
|
||
|
|
||
|
Some default ``store'' actions are ``store'', ``store_const'',
|
||
|
``append'', and ``count''. The default ``typed'' actions are
|
||
|
``store'', ``append'', and ``callback''.
|
||
|
|
||
|
When you add an action, you need to decide if it's a ``store'' action,
|
||
|
a ``typed'', neither, or both. Three class attributes of
|
||
|
\class{Option} (or your \class{Option} subclass) control this:
|
||
|
|
||
|
\begin{memberdesc}{ACTIONS}
|
||
|
All actions must be listed as strings in ACTIONS.
|
||
|
\end{memberdesc}
|
||
|
\begin{memberdesc}{STORE_ACTIONS}
|
||
|
"store" actions are additionally listed here.
|
||
|
\end{memberdesc}
|
||
|
\begin{memberdesc}{TYPED_ACTIONS}
|
||
|
"typed" actions are additionally listed here.
|
||
|
\end{memberdesc}
|
||
|
|
||
|
In order to actually implement your new action, you must override
|
||
|
\class{Option}'s \method{take_action()} method and add a case that
|
||
|
recognizes your action.
|
||
|
|
||
|
For example, let's add an ``extend'' action. This is similar to the
|
||
|
standard ``append'' action, but instead of taking a single value from
|
||
|
the command-line and appending it to an existing list, ``extend'' will
|
||
|
take multiple values in a single comma-delimited string, and extend an
|
||
|
existing list with them. That is, if \longprogramopt{names} is an
|
||
|
``extend'' option of type string, the command line:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
--names=foo,bar --names blah --names ding,dong
|
||
|
\end{verbatim}
|
||
|
|
||
|
would result in a list:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
["foo", "bar", "blah", "ding", "dong"]
|
||
|
\end{verbatim}
|
||
|
|
||
|
Again we define a subclass of \class{Option}:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
class MyOption (Option):
|
||
|
|
||
|
ACTIONS = Option.ACTIONS + ("extend",)
|
||
|
STORE_ACTIONS = Option.STORE_ACTIONS + ("extend",)
|
||
|
TYPED_ACTIONS = Option.TYPED_ACTIONS + ("extend",)
|
||
|
|
||
|
def take_action (self, action, dest, opt, value, values, parser):
|
||
|
if action == "extend":
|
||
|
lvalue = value.split(",")
|
||
|
values.ensure_value(dest, []).extend(lvalue)
|
||
|
else:
|
||
|
Option.take_action(
|
||
|
self, action, dest, opt, value, values, parser)
|
||
|
\end{verbatim}
|
||
|
|
||
|
Features of note:
|
||
|
|
||
|
\begin{itemize}
|
||
|
\item ``extend'' both expects a value on the command-line and stores that
|
||
|
value somewhere, so it goes in both \member{STORE_ACTIONS} and
|
||
|
\member{TYPED_ACTIONS}.
|
||
|
|
||
|
\item \method{MyOption.take_action()} implements just this one new
|
||
|
action, and passes control back to \method{Option.take_action()} for
|
||
|
the standard \module{optparse} actions.
|
||
|
|
||
|
\item \var{values} is an instance of the \class{Values} class, which
|
||
|
provides the very useful \method{ensure_value()}
|
||
|
method. \method{ensure_value()} is essentially \function{getattr()}
|
||
|
with a safety valve; it is called as:
|
||
|
|
||
|
\begin{verbatim}
|
||
|
values.ensure_value(attr, value)
|
||
|
\end{verbatim}
|
||
|
\end{itemize}
|
||
|
|
||
|
If the \member{attr} attribute of \var{values} doesn't exist or is
|
||
|
None, then \method{ensure_value()} first sets it to \var{value}, and
|
||
|
then returns \var{value}. This is very handy for actions like
|
||
|
``extend'', ``append'', and ``count'', all of which accumulate data in
|
||
|
a variable and expect that variable to be of a certain type (a list
|
||
|
for the first two, an integer for the latter). Using
|
||
|
\method{ensure_value()} means that scripts using your action don't
|
||
|
have to worry about setting a default value for the option
|
||
|
destinations in question; they can just leave the default as None and
|
||
|
\method{ensure_value()} will take care of getting it right when it's
|
||
|
needed.
|
||
|
|
||
|
\subsubsection{Other reasons to extend \module{optparse}\label{optparse-extending-other-reasons}}
|
||
|
|
||
|
Adding new types and new actions are the big, obvious reasons why you
|
||
|
might want to extend \module{optparse}. I can think of at least two
|
||
|
other areas to play with.
|
||
|
|
||
|
First, the simple one: \class{OptionParser} tries to be helpful by
|
||
|
calling \function{sys.exit()} when appropriate, ie. when there's an
|
||
|
error on the command-line or when the user requests help. In the
|
||
|
former case, the traditional course of letting the script crash with a
|
||
|
traceback is unacceptable; it will make users think there's a bug in
|
||
|
your script when they make a command-line error. In the latter case,
|
||
|
there's generally not much point in carrying on after printing a help
|
||
|
message.
|
||
|
|
||
|
If this behaviour bothers you, it shouldn't be too hard to ``fix'' it.
|
||
|
You'll have to
|
||
|
|
||
|
\begin{enumerate}
|
||
|
\item subclass OptionParser and override the error() method
|
||
|
\item subclass Option and override the take_action() method -- you'll
|
||
|
need to provide your own handling of the "help" action that
|
||
|
doesn't call sys.exit()
|
||
|
\end{enumerate}
|
||
|
|
||
|
The second, much more complex, possibility is to override the
|
||
|
command-line syntax implemented by \module{optparse}. In this case,
|
||
|
you'd leave the whole machinery of option actions and types alone, but
|
||
|
rewrite the code that processes \var{sys.argv}. You'll need to
|
||
|
subclass \class{OptionParser} in any case; depending on how radical a
|
||
|
rewrite you want, you'll probably need to override one or all of
|
||
|
\method{parse_args()}, \method{_process_long_opt()}, and
|
||
|
\method{_process_short_opts()}.
|
||
|
|
||
|
Both of these are left as an exercise for the reader. I have not
|
||
|
tried to implement either myself, since I'm quite happy with
|
||
|
\module{optparse}'s default behaviour (naturally).
|
||
|
|
||
|
Happy hacking, and don't forget: Use the Source, Luke.
|
||
|
|
||
|
\subsubsection{Examples\label{optparse-extending-examples}}
|
||
|
|
||
|
Here are a few examples of extending the \module{optparse} module.
|
||
|
|
||
|
First, let's change the option-parsing to be case-insensitive:
|
||
|
|
||
|
\verbatiminput{caseless.py}
|
||
|
|
||
|
And two ways of implementing ``required options'' with
|
||
|
\module{optparse}.
|
||
|
|
||
|
Version 1: Add a method to \class{OptionParser} which applications
|
||
|
must call after parsing arguments:
|
||
|
|
||
|
\verbatiminput{required_1.py}
|
||
|
|
||
|
Version 2: Extend \class{Option} and add a \member{required}
|
||
|
attribute; extend \class{OptionParser} to ensure that required options
|
||
|
are present after parsing:
|
||
|
|
||
|
\verbatiminput{required_2.py}
|