#!/usr/bin/env python
# "Optional option arguments" with Optik, version 2:
# override OptionParser's argument-processing methods
# to completely replace Optik's core parsing logic.
import optik
class Option (optik.Option):
# ??? what else is needed ???
def requires_value (self): # now all option args are optional
return 0 # -- not right, but it'll do for now!
class OptionParser (optik.OptionParser):
def _process_long_opt (self, rargs, values):
# Value explicitly attached to arg? Split it off and
# keep it in waiting.
if "=" in arg:
(opt, next) = arg.split("=", 1)
rargs.insert(0, next)
had_explicit_value = 1
else:
opt = arg
had_explicit_value = 0
opt = self._match_long_opt(opt)
option = self._long_opt[opt]
# Three basic cases for the Option here:
# 1) it requires a value
# 2) it takes no value
# 3) it takes an optional value
if option.takes_value():
nargs = option.nargs
if len(rargs) < nargs: # don't have enough arguments
if option.requires_value():
if nargs == 1:
self.error("%s option requires a value" % opt)
else:
self.error("%s option requires %d values"
% (opt, nargs))
else:
value = None
elif nargs == 1: # need one argument and have it
value = rargs.pop()
else: # need multiple args (and have them)
value = tuple(rargs[0:nargs])
del rargs[0:nargs]
elif had_explicit_value:
self.error("%s option does not take a value" % opt)
else:
value = None
option.process(opt, value, values, self)
def _process_short_opts (self, rargs, values):
|