Things get hairy when you want an option to take a variable number of
arguments. For this case, you must write a callback, as optparse doesn't
provide any built-in capabilities for it. And you have to deal with
certain intricacies of conventional Unix command-line parsing that optparse
normally handles for you. In particular, callbacks should implement
the conventional rules for bare "-" and "-" arguments:
"-" or "-" can be option arguments
"-" (if not the argument to some option): halt command-line
processing and discard the "-"
"-" (if not the argument to some option): halt command-line
processing but keep the "-" (append it to parser.largs)
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 optparse doesn't support this sort of thing directly).
Nevertheless, here's a stab at a callback for an option with variable arguments:
def vararg_callback(option, opt_str, 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)
The main weakness with this particular implementation is that negative
numbers in the arguments following "-c" will be interpreted as
further options (probably causing an error), rather than as arguments to
"-c". Fixing this is left as an exercise for the reader.
See About this document... for information on suggesting changes. Document provided by Web Master Resources and hosted at Speedy Domain Registration Company