<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<link rel=
"STYLESHEET" href=
"lib.css" type='text/css'
/>
<link rel=
"SHORTCUT ICON" href=
"../icons/pyfav.png" type=
"image/png" />
<link rel='start' href='../index.html' title='Python Documentation Index'
/>
<link rel=
"first" href=
"lib.html" title='Python Library Reference'
/>
<link rel='contents' href='contents.html'
title=
"Contents" />
<link rel='index' href='genindex.html' title='Index'
/>
<link rel='last' href='about.html' title='About this document...'
/>
<link rel='help' href='about.html' title='About this document...'
/>
<link rel=
"prev" href=
"optparse-callback-example-5.html" />
<link rel=
"parent" href=
"optparse-option-callbacks.html" />
<link rel=
"next" href=
"optparse-extending-optparse.html" />
<meta name='aesop' content='information'
/>
<title>6.21.4.9 Callback example
6: variable arguments
</title>
<div id='top-navigation-panel' xml:id='top-navigation-panel'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"6.21.4.8 Callback example 5:"
href=
"optparse-callback-example-5.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"6.21.4 Option Callbacks"
href=
"optparse-option-callbacks.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"6.21.5 Extending optparse"
href=
"optparse-extending-optparse.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"optparse-callback-example-5.html">6.21.4.8 Callback example
5:
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"optparse-option-callbacks.html">6.21.4 Option Callbacks
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"optparse-extending-optparse.html">6.21.5 Extending optparse
</A>
<!--End of Navigation Panel-->
<H3><A NAME=
"SECTION0082149000000000000000"></A><A NAME=
"optparse-callback-example-6"></A>
6.21.4.9 Callback example
6: variable arguments
Things get hairy when you want an option to take a variable number of
arguments. For this case, you must write a callback, as
<tt class=
"module">optparse
</tt> doesn't
provide any built-in capabilities for it. And you have to deal with
certain intricacies of conventional
<span class=
"Unix">Unix
</span> command-line parsing that
<tt class=
"module">optparse
</tt>
normally handles for you. In particular, callbacks should implement
the conventional rules for bare
<code>"-"</code> and
<code>"-"</code> arguments:
either
<code>"-"</code> or
<code>"-"</code> can be option arguments
bare
<code>"-"</code> (if not the argument to some option): halt command-line
processing and discard the
<code>"-"</code>
bare
<code>"-"</code> (if not the argument to some option): halt command-line
processing but keep the
<code>"-"</code> (append it to
<code>parser.largs
</code>)
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
<tt class=
"module">optparse
</tt> doesn't support
this sort of thing directly).
Nevertheless, here's a stab at a callback for an option with variable
<div class=
"verbatim"><pre>
def vararg_callback(option, opt_str, value, parser):
# 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
if ((arg[:
2] ==
"--" and len(arg)
> 2) or
(arg[:
1] ==
"-" and len(arg)
> 1 and arg[
1] !=
"-")):
setattr(parser.values, option.dest, value)
parser.add_option(
"-c",
"--callback",
action=
"callback", callback=varargs)
The main weakness with this particular implementation is that negative
numbers in the arguments following
<code>"-c"</code> will be interpreted as
further options (probably causing an error), rather than as arguments to
<code>"-c"</code>. Fixing this is left as an exercise for the reader.
<div class='online-navigation'
>
<table align=
"center" width=
"100%" cellpadding=
"0" cellspacing=
"2">
<td class='online-navigation'
><a rel=
"prev" title=
"6.21.4.8 Callback example 5:"
href=
"optparse-callback-example-5.html"><img src='../icons/previous.png'
border='
0' height='
32' alt='Previous Page' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"parent" title=
"6.21.4 Option Callbacks"
href=
"optparse-option-callbacks.html"><img src='../icons/up.png'
border='
0' height='
32' alt='Up One Level' width='
32'
/></A></td>
<td class='online-navigation'
><a rel=
"next" title=
"6.21.5 Extending optparse"
href=
"optparse-extending-optparse.html"><img src='../icons/next.png'
border='
0' height='
32' alt='Next Page' width='
32'
/></A></td>
<td align=
"center" width=
"100%">Python Library Reference
</td>
<td class='online-navigation'
><a rel=
"contents" title=
"Table of Contents"
href=
"contents.html"><img src='../icons/contents.png'
border='
0' height='
32' alt='Contents' width='
32'
/></A></td>
<td class='online-navigation'
><a href=
"modindex.html" title=
"Module Index"><img src='../icons/modules.png'
border='
0' height='
32' alt='Module Index' width='
32'
/></a></td>
<td class='online-navigation'
><a rel=
"index" title=
"Index"
href=
"genindex.html"><img src='../icons/index.png'
border='
0' height='
32' alt='Index' width='
32'
/></A></td>
<div class='online-navigation'
>
<b class=
"navlabel">Previous:
</b>
<a class=
"sectref" rel=
"prev" href=
"optparse-callback-example-5.html">6.21.4.8 Callback example
5:
</A>
<b class=
"navlabel">Up:
</b>
<a class=
"sectref" rel=
"parent" href=
"optparse-option-callbacks.html">6.21.4 Option Callbacks
</A>
<b class=
"navlabel">Next:
</b>
<a class=
"sectref" rel=
"next" href=
"optparse-extending-optparse.html">6.21.5 Extending optparse
</A>
<span class=
"release-info">Release
2.4.2, documentation updated on
28 September
2005.
</span>
<!--End of Navigation Panel-->
See
<i><a href=
"about.html">About this document...
</a></i> for information on suggesting changes.